如何从单年记录中报告每月的服务认可
How to report service recognition per month from single year record
我想从具有货币价值的发票中查看每月的金额,该金额适用于 serviceFromDate 和 serviceToDate 为一整年的服务。
假设我在 2015 年 10 月 16 日开具发票,其中有一个包含以下信息的 lineItem:
lineItemDescription: product subscription
customerRetailPrice: 4000.00
serviceFromDate: 2015-10-16
serviceToDate: 2016-10-15
invoiceNumber: NZ-416
所以我想得到的是服务认可,就是把全年每个月的收入(精确到天数)等同起来。
我期望的是以下列或单独的行(不确定哪个更容易)
yearMonth: 2015-10
daysofService: 15 // days diff between 16th and EOM
serviceRevenue: 164.38 // (00/365=10.96) * 15
lineItemDescription: product subscription
invoiceNumber: NZ-416
yearMonth: 2016-10
daysofService: 15 // days left in last month
serviceRevenue: 328.76 // (00/365=10.96) * 15
lineItemDescription: product subscription
invoiceNumber: NZ-416
... each month value for the year based upon days per month
yearMonth: 2015-11
daysofService: 30 // days of full month November
serviceRevenue: 164.38 // (00/365=10.96) * 30
lineItemDescription: product subscription
invoiceNumber: NZ-416
该视图将显示本月生成的所有发票,因此我想最好是按发票编号对行进行分组,并为每个月自动生成从当前月份到 max serviceTo 所需的尽可能多的列年月。一些发票将仅适用于当前或三个月期间,因此其他月份的列将具有 NULL。
我可以在Excel中为所欲为,报告结果如下图,谢谢
你最好的选择 (IMO) 是确保你的数据库有日历 table。然后,您可以 JOIN
在这个 table 上满足这样的要求,并使这些任务变得更加简单。例如:
SELECT
CAST(YEAR(C.calendar_date) AS CHAR(4)) + '-' + RIGHT('0' + CAST(MONTH(C.calendar_date) AS VARCHAR(2)), 2) AS yearMonth,
COUNT(*) AS daysofService,
T.customerRetailPrice/(DATEDIFF(DY, serviceFromDate, serviceToDate) * COUNT(*)) AS serviceRevenue,
T.lineItemDescription,
T.invoiceNumber
FROM
My_Table T
INNER JOIN Calendar C ON C.calendar_date BETWEEN T.serviceFromDate AND T.serviceToDate
GROUP BY
CAST(YEAR(C.calendar_date) AS CHAR(4)) + '-' + RIGHT('0' + CAST(MONTH(C.calendar_date) AS VARCHAR(2)), 2),
T.customerRetailPrice,
T.lineItemDescription,
T.invoiceNumber
我还没有测试过这段代码,所以它可能需要一些调整,但它应该让你非常接近。
日历 table 只是一个 table,每天都有一个条目。很容易为它生成延伸到未来 100 年(如果需要的话可以更长)的行。然后,您可以为 business_quarter、is_holiday 等内容添加列
下面是日历 table 的示例。您可以添加您可能需要的任何其他特定于您自己的列 business/application(s):
CREATE TABLE Calendar (
calendar_date DATE NOT NULL,
is_holiday BIT NOT NULL DEFAULT (0),
quarter CHAR(2) NOT NULL CHECK quarter IN ('Q1', 'Q2', 'Q3', 'Q4'),
CONSTRAINT PK_Calendar PRIMARY KEY CLUSTERED (calendar_date)
)
我想从具有货币价值的发票中查看每月的金额,该金额适用于 serviceFromDate 和 serviceToDate 为一整年的服务。
假设我在 2015 年 10 月 16 日开具发票,其中有一个包含以下信息的 lineItem:
lineItemDescription: product subscription
customerRetailPrice: 4000.00
serviceFromDate: 2015-10-16
serviceToDate: 2016-10-15
invoiceNumber: NZ-416
所以我想得到的是服务认可,就是把全年每个月的收入(精确到天数)等同起来。
我期望的是以下列或单独的行(不确定哪个更容易)
yearMonth: 2015-10
daysofService: 15 // days diff between 16th and EOM
serviceRevenue: 164.38 // (00/365=10.96) * 15
lineItemDescription: product subscription
invoiceNumber: NZ-416
yearMonth: 2016-10
daysofService: 15 // days left in last month
serviceRevenue: 328.76 // (00/365=10.96) * 15
lineItemDescription: product subscription
invoiceNumber: NZ-416
... each month value for the year based upon days per month
yearMonth: 2015-11
daysofService: 30 // days of full month November
serviceRevenue: 164.38 // (00/365=10.96) * 30
lineItemDescription: product subscription
invoiceNumber: NZ-416
该视图将显示本月生成的所有发票,因此我想最好是按发票编号对行进行分组,并为每个月自动生成从当前月份到 max serviceTo 所需的尽可能多的列年月。一些发票将仅适用于当前或三个月期间,因此其他月份的列将具有 NULL。
我可以在Excel中为所欲为,报告结果如下图,谢谢
你最好的选择 (IMO) 是确保你的数据库有日历 table。然后,您可以 JOIN
在这个 table 上满足这样的要求,并使这些任务变得更加简单。例如:
SELECT
CAST(YEAR(C.calendar_date) AS CHAR(4)) + '-' + RIGHT('0' + CAST(MONTH(C.calendar_date) AS VARCHAR(2)), 2) AS yearMonth,
COUNT(*) AS daysofService,
T.customerRetailPrice/(DATEDIFF(DY, serviceFromDate, serviceToDate) * COUNT(*)) AS serviceRevenue,
T.lineItemDescription,
T.invoiceNumber
FROM
My_Table T
INNER JOIN Calendar C ON C.calendar_date BETWEEN T.serviceFromDate AND T.serviceToDate
GROUP BY
CAST(YEAR(C.calendar_date) AS CHAR(4)) + '-' + RIGHT('0' + CAST(MONTH(C.calendar_date) AS VARCHAR(2)), 2),
T.customerRetailPrice,
T.lineItemDescription,
T.invoiceNumber
我还没有测试过这段代码,所以它可能需要一些调整,但它应该让你非常接近。
日历 table 只是一个 table,每天都有一个条目。很容易为它生成延伸到未来 100 年(如果需要的话可以更长)的行。然后,您可以为 business_quarter、is_holiday 等内容添加列
下面是日历 table 的示例。您可以添加您可能需要的任何其他特定于您自己的列 business/application(s):
CREATE TABLE Calendar (
calendar_date DATE NOT NULL,
is_holiday BIT NOT NULL DEFAULT (0),
quarter CHAR(2) NOT NULL CHECK quarter IN ('Q1', 'Q2', 'Q3', 'Q4'),
CONSTRAINT PK_Calendar PRIMARY KEY CLUSTERED (calendar_date)
)