Redshift多行转列(Pivot)实现:无需手动编写CASE WHEN匹配各枚举值
Redshift 免手动枚举多行转列方案
Redshift无原生动态行转列语法,可通过「自动生成PIVOT查询语句」的方式避免手动编写大量CASE WHEN逻辑,操作步骤如下:
- 假设你的源表名为
seller_product,先执行以下SQL生成最终查询语句:
SELECT 'SELECT ' || LISTAGG('LISTAGG(CASE WHEN seller = ''' || seller || ''' THEN product END, '','') AS ' || seller, ', ') WITHIN GROUP (ORDER BY seller) || ' FROM (SELECT seller, product, ROW_NUMBER() OVER (PARTITION BY seller ORDER BY product) AS rn FROM seller_product) t GROUP BY rn ORDER BY rn;' FROM (SELECT DISTINCT seller FROM seller_product);
- 复制上一步输出的SQL,直接执行即可得到你需要的按卖家分列、每个列存储对应卖家在售产品的结果。如果需要全流程自动化,可将上述逻辑封装到Redshift存储过程中,通过
EXECUTE执行生成的动态SQL即可,无需人工介入。
原理解释
- 内层子查询先给每个卖家的产品按顺序生成行号,相同行号的不同卖家产品会落在结果的同一行,无对应产品的位置自动为空
- 外层通过
LISTAGG自动拼接所有卖家的聚合逻辑,无需手动枚举所有distinct的seller值,适配seller数量多的场景 - 如果seller数量过多触发LISTAGG长度限制,可在LISTAGG后添加
MAXERROR 0,或调整会话参数SET max_string_size = extended;解决。
示例执行效果
你的示例数据执行生成后的查询后,输出结果如下:
| a | b | c | d |
|---|---|---|---|
| 1 | 1 | 4 | 7 |
| 4 | 2 | 1 | |
| 6 | 7 |
内容的提问来源于stack exchange,提问作者teogj
相关产品推荐
相关产品推荐

