如何在SSIS中拆分列并按Area分组生成多列Balance数据?
使用SSIS实现行转列(拆分Days列展示对应Balance)
需求说明
原输入表结构:
| Area | Days | Balance |
|---|---|---|
| Area 1 | 35 | 1000 |
| Area 2 | 35 | 1000 |
| Area 3 | 35 | 1000 |
| Area 1 | 60 | 4000 |
| Area 2 | 60 | 4000 |
| Area 3 | 60 | 4000 |
目标输出表结构:
| Area | 35D | 60D |
|---|---|---|
| Area 1 | 1000 | 4000 |
| Area 2 | 1000 | 4000 |
| Area 3 | 1000 | 4000 |
下面提供两种实现方法,其中包含你提到的Derived Column方案:
方法一:Derived Column + Aggregate 组合实现
1. 添加Derived Column转换
在数据流任务中,连接数据源后拖入Derived Column组件,打开编辑器:
- 创建派生列
35D,表达式写为:[Days] == 35 ? [Balance] : NULL(DT_I4)
(如果Balance是小数类型,将DT_I4替换为对应的数据类型,比如DT_DECIMAL) - 创建派生列
60D,表达式写为:[Days] == 60 ? [Balance] : NULL(DT_I4)
这一步的作用是将对应Days的Balance值保留,其余行设为NULL。
2. 添加Aggregate转换
拖入Aggregate组件连接Derived Column的输出,打开编辑器:
- 将
Area列的操作设为Group By,作为分组依据 - 对
35D和60D列,选择Max(或Min)聚合函数,聚合会自动忽略NULL值,提取每个Area对应的有效Balance值。
3. 映射目标表
将Aggregate组件的输出连接到目标数据源,完成列映射即可生成目标结构。
方法二:使用Pivot转换(更高效直接)
如果Days的取值是固定的(仅35、60),用Pivot转换可以一步完成转置:
1. 添加Pivot转换
连接数据源后拖入Pivot组件,打开编辑器:
- Pivot Key:选择
Days(要转换为列的字段) - Set Key:选择
Balance(要聚合的字段) - Pivot Value:点击「New」,输入列名
35D,对应Pivot Key值35;再创建60D,对应值60,聚合函数选择Max(或Min) - Group By:选择
Area作为分组列
2. 映射目标表
将Pivot组件的输出连接到目标表,完成列映射即可得到目标结果。
内容的提问来源于stack exchange,提问作者Jack Wheatley
相关产品推荐
相关产品推荐

