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;
错误点说明
- 列名不匹配:原表列名为
Type,代码中误写为ROLE,导致无法匹配数据 - 缺少分组逻辑:要实现 ID 唯一,必须用
GROUP BY ID对 ID 分组,否则 DB2 会因「非聚合列未在 GROUP BY 中」报错 - 语法遗漏:SELECT 子句中,ID 和后续聚合函数之间缺少逗号分隔
代码逻辑解释
CASE WHEN语句:判断当前行的 Type 是否为 A/B,是则返回对应 Email,否则返回 NULLMAX()聚合函数:同一 ID 分组内,自动过滤 NULL 值,保留唯一有效的 Email(同一 ID 下 Type A/B 只会出现 0 或 1 次)GROUP BY ID:确保每个 ID 仅返回一行结果ORDER BY ID:按 ID 排序,与目标输出格式一致
内容的提问来源于stack exchange,提问作者Looz
相关产品推荐
相关产品推荐

