Oracle SQL行转列操作PIVOT聚合仅返回单行问题咨询
Oracle SQL行转列实现方案
问题排查
你的现有代码存在两个核心错误导致输出不符合预期:
- 子查询未包含分组维度字段
LVL:PIVOT 语法会默认按子查询中除聚合字段、转列字段之外的所有返回字段分组,你未放入LVL且保留了BATCH_ID、CONTACT_ID,如果这两个字段和LVL不是一一对应关系,会直接导致分组逻辑错误 - 转列匹配值与实际值不匹配:你在
FOR TABLE_SRC IN条件中写的匹配值是'1BASE'、'1INT',和样本数据里TABLE_SRC的实际值BASE、INT不匹配,导致聚合函数取不到对应值
正确实现代码
SELECT * FROM ( SELECT LVL, -- 必须保留分组维度字段 COL_VALUE, TABLE_SRC -- 若确认BATCH_ID、CONTACT_ID与LVL一一对应,可取消注释保留以下字段 -- ,BATCH_ID -- ,CONTACT_ID FROM MISMATCH ) PIVOT ( MAX(COL_VALUE) FOR TABLE_SRC IN ( 'BASE' AS BASE, 'INT' AS INT ) ) ORDER BY LVL;
输出说明
执行以上代码后会返回两行结果,和你的预期完全匹配:
| LVL | BASE | INT |
|---|---|---|
| 16 | BASE: ADDRESS_LINE_2:X | INT: ADDRESS_LINE_2:NULL |
| 17 | BASE: ADDRESS_LINE_3:X | INT: ADDRESS_LINE_3:NULL |
如果你的业务需要保留BATCH_ID、CONTACT_ID,且同一LVL下这两个字段存在多个不同值,需要根据业务规则选择合适的聚合方式(如取最大值、取首个值等)调整查询逻辑即可。
内容的提问来源于stack exchange,提问作者kathnisss
相关产品推荐
相关产品推荐

