将每月数据分解为每日

时间:2013-03-26 14:09:18

标签: sql-server-2008 tsql

我有以下montly格式的公司预算数据。 SqlFiddle link here

Dept#  YearMonth  Budget($)
--------------------------
001    201301     100
001    201302     110
001    201303     105
..     .....      ...
002    201301     200
...    .....      ...

我需要将其分解为日常记录,如下所示:

Dept#  Date       Budget($)
--------------------------
001    20130101     xxx
001    20130102     xxx
001    20130103     xxx
..     .....      ...

我需要从源表中的每条记录生成每日记录。我不想假设每个月有30天。如何确定每个月的实际天数并按上面显示的格式将其分解?

我感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:4)

尝试:

with cte as
(select [dept#], [YearMonth], convert(datetime,[YearMonth]+'01',112) [Date], [Budget($)]
 from budget
 union all
 select [dept#], [YearMonth], dateadd(d, 1, [Date]) [Date], [Budget($)]
 from cte
 where datediff(m,[Date],dateadd(d, 1, [Date]))=0
)
select [dept#], [Date], 
       1.0*[Budget($)] / count(*) over (partition by [dept#], [YearMonth]) [DailyBudget($)]
from cte
order by 1,2

(在预算中有一个从整数到浮点的隐式转换,否则每日汇率将四舍五入到最接近的美元 - 如果预算数据类型已经被保存为numeric(10,2)之类的话,则不需要这样做。)

(SQLFiddle here