对于来自DataSource / Select-Statement

时间:2015-04-22 09:39:18

标签: sql sql-server ssis

以下是用例: 用户输入每月的预算。所以有一个包含[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循环容器的经验。我的问题是否可以用其中一个容器解决,还是我需要不同的结构/方法?

1 个答案:

答案 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]