2013-03-26 81 views
2

我有以下蒙太奇格式的公司的预算数据。 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天。我如何确定每个月的实际天数并按上面显示的格式分解?

我很欣赏任何形式的帮助。谢谢!

回答

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

+0

它工作得很好。非常感谢你! – Thracian 2013-03-26 14:39:12

+0

很高兴能帮到你。 – 2013-03-26 14:39:31

+0

非常棒,为我完美工作,将每月数据分成几天。 – Paul 2016-11-17 11:18:42

相关问题