2

我有一家公司的预算数据,格式如下。SqlFiddle 链接在这里

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

1 回答 1

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 )

于 2013-03-26T14:27:16.497 回答