根据开始和结束日期的年/月记录返回的金额

时间:2019-09-18 11:05:24

标签: sql-server tsql date-range

我有一张表格,其中包含以下数据:

ID |start_date  |end_date   |amount
---|------------|-----------|--------
1  |2019-03-21  |2019-05-09 |10000.00
2  |2019-04-02  |2019-04-10 |30000.00
3  |2018-11-01  |2019-01-08 |20000.00

我希望以年/月为基础,以正确的计算量取回拆分的记录。

我希望结果是这样的:

ID |month |year   |amount
---|------|-------|--------
1  |3     | 2019  | 2200.00
1  |4     | 2019  | 6000.00
1  |5     | 2019  | 1800.00
2  |4     | 2019  |30000.00
3  |11    | 2018  | 8695.65
3  |12    | 2018  | 8985.51
3  |1     | 2019  | 2318.84

实现此目标的最佳方法是什么?我认为您必须使用DATEDIFF来获取start_date和end_date之间的天数,以计算每天的金额,但是我不确定如何将其作为每月/每年的记录返回。

提前Tnx!

1 个答案:

答案 0 :(得分:2)

这是一个主意。我使用Tally来为每天创建与该Amount相关的金额的一天。然后,我将CREATE TABLE dbo.YourTable(ID int, StartDate date, EndDate date, Amount decimal(12,2)); GO INSERT INTO dbo.YourTable (ID, StartDate, EndDate, Amount) VALUES(1,'2019-03-21','2019-05-09',10000.00), (2,'2019-04-02','2019-04-10',30000.00), (3,'2018-11-01','2019-01-08',20000.00); GO --Create a tally WITH N AS( SELECT N FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)), Tally AS( SELECT TOP (SELECT MAX(DATEDIFF(DAY, t.StartDate, t.EndDate)+1) FROM dbo.YourTable t) --Limits the rows, might be needed in a large dataset, might not be, remove as required ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 AS I FROM N N1, N N2, N N3), --1000 days, is that enough? --Create the dates Dates AS( SELECT YT.ID, DATEADD(DAY, T.I, YT.StartDate) AS [Date], YT.Amount, COUNT(T.I) OVER (PARTITION BY YT.ID) AS [Days] FROM Tally T JOIN dbo.YourTable YT ON T.I <= DATEDIFF(DAY, YT.StartDate, YT.EndDate)) --And now aggregate SELECT D.ID, DATEPART(MONTH,D.[Date]) AS [Month], DATEPART(YEAR,D.[Date]) AS [Year], CONVERT(decimal(12,2),SUM(D.Amount / D.[Days])) AS Amount FROM Dates D GROUP BY D.ID, DATEPART(MONTH,D.[Date]), DATEPART(YEAR,D.[Date]) ORDER BY D.ID, [Year], [Month]; GO DROP TABLE dbo.YourTable; GO 的值除以天数,然后按天和年分组:

ID, TESTA, RESULTA, UNITA, TESTB, RESULTB, UNITB, OTHER_UNITB
1,  'T1',  10,      1,     'T2',  2.5,          , 'kg',
2,  'T1',  15,      1,     'T2',  1.5,     1,         ,
3,  'T1',    ,       ,     'T2',  1,       1,

DB<>Fiddle