Redshift SQL行转列需求:将Source字段值转为列头
问题描述
源数据表temp的结构与数据如下:
| Source | value | ID |
|---|---|---|
| A | C123 | 111 |
| B | V123 | 111 |
| A | C456 | 222 |
| B | V456 | 222 |
需要将Source列的取值转换为新的列头,对应value列的值填入对应列,期望输出结构如下:
| A | B | ID |
|---|---|---|
| C123 | V123 | 111 |
| C456 | V456 | 222 |
此前尝试使用LISTAGG函数,仅能得到带分隔符的单行数据,无法实现分列效果,尝试的SQL语句为:
SELECT id, LISTAGG(DISTINCT value , '|') WITHIN GROUP (ORDER BY source) FROM temp GROUP BY id
解决方案
方法1:条件聚合(通用兼容写法)
通过CASE语句结合聚合函数实现列转行,因为每个ID与Source的组合唯一,使用MAX或MIN均可:
SELECT id, MAX(CASE WHEN source = 'A' THEN value END) AS A, MAX(CASE WHEN source = 'B' THEN value END) AS B FROM temp GROUP BY id ORDER BY id;
方法2:Redshift专属PIVOT语法
Redshift支持PIVOT操作,写法更简洁:
SELECT * FROM temp PIVOT ( MAX(value) FOR source IN ('A' AS A, 'B' AS B) ) AS pivoted_table ORDER BY id;
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

