UNPIVOT关联CTE查询提示MERCHANDISE_AMT列无效求助
报错根本原因
UNPIVOT 操作的执行逻辑为:你在 IN (MERCHANDISE_AMT, FREIGHT_AMT, SALETX_AMT) 中指定的所有列,执行UNPIVOT后会被合并转换为value(存储原列的数值)和col(存储原列的名称)两个新字段,原指定列会从结果集中直接移除。你在主查询的SELECT列表中仍然保留了MERCHANDISE_AMT字段,此时该字段已经被UNPIVOT合并消去,自然会提示列不存在。
这也是为什么你把MERCHANDISE_AMT从UNPIVOT的列列表移除后查询可以正常运行:移除后该字段不会被UNPIVOT处理,仍然保留在CTE的输出字段列表中,SELECT语句可以正常识别。
解决方案
根据你的实际需求二选一即可:
- 如果你需要同时保留原
MERCHANDISE_AMT字段、仅对运费和税金做列转行:保持当前可运行的写法即可,无需额外修改。 - 如果你需要把
MERCHANDISE_AMT也纳入列转行的范围:直接删掉主查询SELECT列表里的MERCHANDISE_AMT字段即可。如果需要区分当前行对应的原列名,可以把col字段加入SELECT列表,修改示例如下:
SELECT INVOICE_ID, VOUCHER_LINE_NUM - 1 + row_number() over (PARTITION BY INVOICE_ID, VOUCHER_LINE_NUM ORDER BY VOUCHER_LINE_NUM) AS VOUCHER_LINE_NUM, LINE_TYPE, col, -- 新增该字段可查看当前行对应的原列名,删除原SELECT中的MERCHANDISE_AMT INVOICE_QTY, UNIT_PRICE, UNIT_OF_MEASURE, DESCR , -- 其余原有字段保持不变,无需修改 value FROM CTE unpivot (value FOR col IN (MERCHANDISE_AMT, FREIGHT_AMT, SALETX_AMT)) u WHERE value > 0.00
额外注意:UNPIVOT要求IN列表内的所有字段数据类型、精度必须完全一致,你需要提前确认
MERCHANDISE_AMT、FREIGHT_AMT、SALETX_AMT三个字段的类型统一,如果不一致需要在CTE中先做类型转换,避免后续出现类型不匹配报错。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

