日期:2014-05-18  浏览次数:20784 次

请教一个SSIS数据清洗的问题
我刚接触BI,使用SSIS做数据整合的时候,碰到了这样一个问题,请大家给予指导:

财务系统每个年度都会建一个费用字典表,基本上每个年度的表中的数据差异不大,但是存在一些不一致的数据,例如

年度 科目编号 科目名称
2008 00001 会议费
2009 00001 调研费
2009 00002 会议费

可以看出,两个年度中,会议费的科目编号是不一样的。
我现在要做跨年度的经费统计,所以想出一张统一的费用字典表,通过ETL以上条目可变成如下形式:
00001 会议费
00002 调研费

数据流应该怎么做呢?

------解决方案--------------------
SQL code
;with cte as
(
select 科目编号,科目名称 ,pm=row_number()over(partition by 科目名称 order by getdate())
)
select * from cte where pm=1

------解决方案--------------------
首先纠正LZ的一些设计思想吧,不要为了SSIS 而SSIS,SSIS 只是个工具箱而已,里面的组件就像工具,这里面有个最基本的工具叫 Execute SQL, 可以执行绝大多数的SQL 语句,不一定非要用数据流任务。
------解决方案--------------------
不知道楼主的数据库中的表是什么样具体的形式,还有不知道楼主最终的结果要不要显示科目编号
1:若科目编号,科目名称,和对应的费用数据在一张表里面,就不要用
select 取年(时间),科目编号,科目名称,sum(费用) from table group by 取年(时间) 的格式
直接用 select 取年(时间),科目名称,sum(费用) from table group by 取年(时间)
因为科目编号是不准的,直接根据科目名称来取数据,然后如果想要显示科目编号,就直接可以给每个
科目名称设一个编号…… (估计这种情况应该不会存在)
2:一般情况下,我估计楼主的表数据为
数据表t1 : 时间,科目编号,费用,……
科目对应表t2: 时间,科目编号,科目名称……
这样的话一种做法是
select 取年(t1.时间),t2.科目名称,sum(t1.费用)from t1,t2 
where 格式(t1.时间)=t2.时间 and t1.科目编号=t2.科目编号 group by 取年(t1.时间)

另一种办法就是在两个表中分别加一个字段,使用联合键来对应,如果只是想得到最终的费用表,不建议用 这种办法,这是一种我研究出的一种解决缓慢变化维的办法(并已实际证明正确)

3:打了不少字了,希望对楼主有所帮助,有什么问题可以加我互相交流学习!!!
------解决方案--------------------
不知道楼主的数据库中的表是什么样具体的形式,还有不知道楼主最终的结果要不要显示科目编号
1:若科目编号,科目名称,和对应的费用数据在一张表里面,就不要用
SQL code
select 取年(时间),科目编号,科目名称,sum(费用) from table group by 取年(时间)

------解决方案--------------------
SSIS中有很多可以写SQL语句的组件,你可以在源数据那里选择SQL查询,然后写脚本取数据。