我有一个简单的要求。下面是我的sql表。
ID Cname StartDate EndDate Value
1 x 01/15/2015 01/20/2015 50
2 x 01/17/2015 01/22/2015 60
3 y 02/15/2015 02/20/2015 40
4 y 02/17/2015 02/22/2015 80
我有日期范围,我想将每个日期范围转换为每天的行。除此之外,每当日期重叠时,它都会添加值。 以下是示例输出以获得更多说明。
Cname date value
x 1/15/2015 60
x 1/16/2015 60
x 1/17/2015 110
x 1/18/2015 110
x 1/19/2015 110
x 1/20/2015 110
x 1/21/2015 60
x 1/22/2015 60
y 2/15/2015 40
y 2/16/2015 40
y 2/17/2015 120
y 2/18/2015 120
y 2/19/2015 120
y 2/20/2015 120
y 2/21/2015 80
y 2/22/2015 80
任何帮助都将不胜感激。
答案 0 :(得分:3)
您可以使用here描述的技术,以便为表格的每个间隔生成日期范围。然后只需按Cname
和日期分组即可获得所需的结果集:
;WITH natural AS
(
SELECT ROW_NUMBER() OVER (ORDER BY [object_id]) - 1 AS val
FROM sys.all_objects
)
SELECT m.Cname, d = DATEADD(DAY, natural.val, m.StartDate),
SUM(value) AS value
FROM mytable AS m
INNER JOIN natural ON natural.val <= DATEDIFF(DAY, m.StartDate, m.EndDate)
GROUP BY Cname, DATEADD(DAY, natural.val, m.StartDate)
ORDER BY Cname, d
CTE
用于创建计数表。然后,此表的编号用于向StartDate
添加1,2,3,......天,直到达到EndDate
。
如果按Cname, [Date]
分组,则SUM
将返回所需的value
,因为它会在每个Cname
分区中添加任何重叠记录。