SQL将每个日期范围转换为每天的行

时间:2015-05-12 21:28:34

标签: sql-server tsql date

我有一个简单的要求。下面是我的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

任何帮助都将不胜感激。

1 个答案:

答案 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分区中添加任何重叠记录。

SQL Fiddle Demo