以下是用例: 用户输入每月的预算。所以有一个包含[Year],[Month]和[BudgetValue]字段的表格。
示例:
2014 01 200'000.-
2014 02 250'000.-
对于每个条目,我想从我的DimDate中选择工作日。例如,对于2014年1月,我将获得23个日期。 (在我的DimDate中,我有一点标记所有工作日)
在我的实际FactBudget中,我会在23个日期中插入每日预算。
示例:
2014.01.02 (200'000.-)/23
2014.01.03 (200'000.-)/23
etc.
我没有使用SSIS中的For / Foreach循环容器的经验。我的问题是否可以用其中一个容器解决,还是我需要不同的结构/方法?
答案 0 :(得分:0)
首先创建值为1-31的临时表。我们称之为#days。
然后使用它来创建您的日常记录:
Select * from MyTable a
cross join #days b
这将为每个MyTable行创建31行,每个(可能的一天)一行。接下来我们想要摆脱那些周末或不是真实的日子(注意,我在这里使用临时表,这样你就可以看到我在做什么,但这可以折叠成一个查询)。
Select cast(b.[day] as varchar) + '-' + cast(a.[month] as varchar) + '-' + cast(a.[year] as varchar) as MyDate, a.*
into #temp2
from MyTable a
cross join #days b
where isdate(cast(d as varchar) + '-' + cast(m as varchar) + '-' + cast(y as varchar)) = 1 --Get rid of non-dates, like February 31
delete
from #temp2
where datepart(weekday, MyDate) in (1,7) --Get rid of weekends
最后,计算每个月的工作日数,并将其重新加入到您的桌面上(您也可以使用分区执行此操作,但我认为自我加入更容易理解):
select a.MyDate, a.BudgetValue*1.0/CountDays as BudgetPerDay from #temp2 a
left join
(select [year],[month], count(*) as CountDays from #temp2 group by [year],[month]) b
on a.[year] = b.[year] and a.[month] = b.[month]