You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cloud DB2中实现多行记录转多列(行转列)SQL解决方案

DB2 行转列(Type A/B 转为列)SQL 解决方案

问题描述

原数据集(表名:MYSCHEMA.MYTABLE):

ID  Type    Email
1   A   emily&gmail.com
1   B   adam&gmail.com
1   C   tim&gmail.com
2   A   jim&gmail.com
2   C   kenny&gmail.com
3   A   sam&gmail.com
3   B   asd123&gmail.com
3   C   emma&gmail.com
4   D   jkl&gmail.com
4   F   tester&gmail.com
4   G   form&gmail.com
5   B   another&gmail.com
5   C   idk&gmail.com

需要转换为如下格式:

ID   A                 B
1    emily&gmail.com   adam&gmail.com
2    jim&gmail.com     NULL
3    sam&gmail.com     asd123&gmail.com
4    NULL              NULL
5    NULL              another&gmail.com

核心要求:

  • ID 唯一展示
  • 将 Type 为 A、B 的 Email 分别转为对应列,无对应 Type 则填充 NULL

用户尝试的错误代码:

SELECT ID
       MAX(CASE WHEN ROLE = 'A' THEN T.EMAIL ELSE NULL END) AS A,
       MAX(CASE WHEN ROLE = 'B' THEN T.EMAIL ELSE NULL END) AS B
  
FROM MYSCHEMA.MYTABLE T 

修正后的 SQL 代码

SELECT ID,
       MAX(CASE WHEN Type = 'A' THEN Email ELSE NULL END) AS A,
       MAX(CASE WHEN Type = 'B' THEN Email ELSE NULL END) AS B
FROM MYSCHEMA.MYTABLE
GROUP BY ID
ORDER BY ID;

错误点说明

  1. 列名不匹配:原表列名为 Type,代码中误写为 ROLE,导致无法匹配数据
  2. 缺少分组逻辑:要实现 ID 唯一,必须用 GROUP BY ID 对 ID 分组,否则 DB2 会因「非聚合列未在 GROUP BY 中」报错
  3. 语法遗漏:SELECT 子句中,ID 和后续聚合函数之间缺少逗号分隔

代码逻辑解释

  • CASE WHEN 语句:判断当前行的 Type 是否为 A/B,是则返回对应 Email,否则返回 NULL
  • MAX() 聚合函数:同一 ID 分组内,自动过滤 NULL 值,保留唯一有效的 Email(同一 ID 下 Type A/B 只会出现 0 或 1 次)
  • GROUP BY ID:确保每个 ID 仅返回一行结果
  • ORDER BY ID:按 ID 排序,与目标输出格式一致

内容的提问来源于stack exchange,提问作者Looz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 10:10:33