如何在SMART400的WRKQRY中实现数据转置?
在SMART400的WRKQRY中实现数据转置
可以在WRKQRY中实现数据转置,但需要通过条件聚合+分组的方式完成,因为WRKQRY没有内置的转置函数。以下是具体实现步骤:
1. 原始数据说明
假设你的数据存储在名为SOURCE_TABLE的表中,包含两列:GROUP_COL(分组标识,如T1、T2)和VALUE_COL(待转置的值,如A1、A2),原始数据如下:
GROUP_COL VALUE_COL T1 A1 T1 A2 T1 A3 T2 B1 T2 B2
2. 生成组内序列编号
首先为每个分组内的记录生成连续序列编号,用于后续映射到不同列。通过子查询结合ROW_NUMBER()窗口函数实现:
SELECT GROUP_COL, VALUE_COL, ROW_NUMBER() OVER (PARTITION BY GROUP_COL ORDER BY VALUE_COL) AS SEQ_NUM FROM SOURCE_TABLE
该查询会为每个分组内的记录分配从1开始的编号,例如T1组的三条记录对应1、2、3,T2组的两条记录对应1、2。
3. 条件聚合实现转置
基于上述子查询,使用CASE语句结合MAX()聚合函数,将不同序列编号的行值映射到对应列,最后按分组字段聚合:
SELECT GROUP_COL, MAX(CASE WHEN SEQ_NUM = 1 THEN VALUE_COL ELSE '' END) AS COL1, MAX(CASE WHEN SEQ_NUM = 2 THEN VALUE_COL ELSE '' END) AS COL2, MAX(CASE WHEN SEQ_NUM = 3 THEN VALUE_COL ELSE '' END) AS COL3 FROM ( SELECT GROUP_COL, VALUE_COL, ROW_NUMBER() OVER (PARTITION BY GROUP_COL ORDER BY VALUE_COL) AS SEQ_NUM FROM SOURCE_TABLE ) AS SUB_QUERY GROUP BY GROUP_COL
4. 最终输出结果
执行上述查询后,将得到期望的转置格式:
GROUP_COL COL1 COL2 COL3 T1 A1 A2 A3 T2 B1 B2
注意事项
- 若分组内的最大记录数超过3,需添加更多
CASE语句(如SEQ_NUM=4对应COL4)覆盖所有可能的列。 - 如果WRKQRY不支持
ROW_NUMBER()窗口函数,可通过自连接方式生成序列编号,但效率会略低。
内容的提问来源于stack exchange,提问作者Asymptote
相关产品推荐
相关产品推荐

