我有很长的帐户列表,其中包含日期范围和费用,例如,这里有两行:
Account Start_date End_date Cost
Megadeal 11/6/2015 13/6/2015 1000$
Superstar 12/8/2014 14/8/2014 2000$
我需要填充一个列表,其中包含每个范围内的所有日期,每天一行,每天都有帐户名称和费用。结果看起来应该是这样的:
Megadeal 11/6/2015 1000
Megadeal 12/6/2015 1000
Megadeal 13/6/2015 1000
Superstar 12/8/2014 2000
Superstar 13/8/2014 2000
Superstar 14/8/2014 2000
每次填写不同范围的日期列表(不同的开始日期和结束日期)的含义。
有什么建议吗?
答案 0 :(得分:2)
您可以使用Tally Table生成日期:
DECLARE @maxDiff INT;
SELECT @maxDiff = MAX(DATEDIFF(DAY, Start_Date, End_Date)) FROM tbl;
WITH E1(N) AS( -- 10 ^ 1 = 10 rows
SELECT 1 FROM(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(N)
),
E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), -- 10 ^ 2 = 100 rows
E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), -- 10 ^ 4 = 10,000 rows
E8(N) AS(SELECT 1 FROM E4 a CROSS JOIN E4 b), -- 10 ^ 8 = 10,000,000 rows
CteTally(N) AS(
SELECT TOP(@maxDiff + 1) ROW_NUMBER() OVER(ORDER BY(SELECT NULL))
FROM E8
)
SELECT
t.Account,
Date = DATEADD(DAY, ct.N - 1, t.Start_Date),
t.Cost
FROM tbl t
CROSS JOIN CteTally ct
WHERE DATEADD(DAY, ct.N - 1, t.Start_Date) <= t.End_Date
ORDER BY t.Account, Date;