我有以下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天。如何确定每个月的实际天数并按上面显示的格式将其分解?
我感谢任何帮助。谢谢!
答案 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)