For 从 DataSource/Select-Statement 循环遍历 Data/Rows

For Loop over Data/Rows from a DataSource/Select-Statement

这是用例: 用户输入每个月的预算。因此,有一个 table,其中包含字段 [Year]、[Month] 和 [BudgetValue]。

示例:

2014  01  200'000.-
2014  02  250'000.-

对于这些条目中的每一个,我想 select 来自我的 DimDate 的工作日日期。例如,对于 2014 年 1 月,我将获得 23 个日期。 (在我的 DimDate 中,我有一个标记所有工作日的位)

然后在我实际的 FactBudget 中插入包含 23 个日期的每日预算。

示例:

2014.01.02   (200'000.-)/23
2014.01.03   (200'000.-)/23
etc.

我没有使用 SSIS 中的 For/Foreach 循环容器的经验。我的问题甚至可以用其中一个容器解决,还是我需要一个不同的 structure/approach?

首先创建一个值为 1-31 的临时 table。我们将其称为#days。

然后用它来创建您的日常记录:

Select * from MyTable a
cross join #days b

这将为您的每个 MyTable 行创建 31 行,每(可能的一天)一行。接下来我们要去掉那些周末或非真实日子(注意,我在这里使用 temp tables 所以你可以看到我在做什么,但这可以合并为一个查询)。

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

最后,计算每个月的工作日数,然后将其连接回您的 table(您也可以使用分区来执行此操作,但我认为自连接更容易遵循):

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]