Oracle Pivot语句ORDER BY失效:PO_ITEM_ID无效标识符问题求助
问题解决:Oracle Pivot后ORDER BY报无效标识符
错误原因
你的SQL在Pivot后直接使用ORDER BY po_item_id DESC时,Oracle无法正确识别po_item_id列,这是Pivot语法解析优先级导致的外层排序无法直接引用子查询列的问题。
修正后的SQL
SELECT t.* FROM ( SELECT * FROM ( SELECT po_item_id, CASE WHEN note_nbr LIKE '%C505%' THEN 'C505' WHEN note_nbr LIKE '%C506%' THEN 'C506' WHEN note_nbr LIKE '%C507%' THEN 'C507' WHEN note_nbr LIKE '%C508%' THEN 'C508' WHEN note_nbr LIKE '%C003%' THEN 'C003' END c FROM SMP_PO_ITEM_NOTES WHERE note_nbr LIKE '%C505%' OR note_nbr LIKE '%C506%' OR note_nbr LIKE '%C507%' OR note_nbr LIKE '%C508%' OR note_nbr LIKE '%C003%' ) PIVOT( COUNT(po_item_id) FOR c IN ('C505' AS C505, 'C506' AS C506, 'C507' AS C507, 'C508' AS C508, 'C003' AS C003) ) ) t ORDER BY t.po_item_id DESC;
关键修改点
- 给Pivot的
IN子句中每个值指定别名(如'C505' AS C505),确保生成的列名是规范的无引号格式,和你需要的输出表头完全匹配。 - 将整个Pivot结果嵌套在子查询
t中,在外层通过t.po_item_id明确引用列进行排序,解决Oracle的列识别问题。
输出示例
| PO_ITEM_ID | C505 | C506 | C507 | C508 | C003 |
|---|---|---|---|---|---|
| 0003 | 1 | 0 | 0 | 0 | 0 |
| 0002 | 0 | 0 | 1 | 0 | 0 |
| 0001 | 1 | 0 | 1 | 0 | 0 |
内容的提问来源于stack exchange,提问作者Thilini
相关产品推荐
相关产品推荐

