如何从单年记录中报告每月的服务认可

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)
)