Oracle 11g Unpivot触发ORA-56901错误,求解决方法
解决Oracle 11g UNPIVOT时出现ORA-56901错误的方法
我来帮你搞定这个问题!你遇到的ORA-56901错误,核心原因是Oracle 11g的UNPIVOT语法不允许在IN子句里使用非常量表达式——你原来的代码里用了year || '-01'这种引用表中列的拼接逻辑当别名,这在11g里是不被允许的,必须用固定的字符串作为别名。
下面给你两种可行的解决方案,都能得到你想要的输出格式:
方法1:先UNPIVOT转换月份,再拼接时间字段
先把jan、feb、mar转成固定的月份标识,之后再和year字段拼接成YYYY-MM格式的ID_TIMESPAN:
SELECT city, state, year || '-' || month_code AS ID_TIMESPAN, USD FROM table1 UNPIVOT ( USD FOR month_code IN ( jan AS '01', feb AS '02', mar AS '03' ) );
这个方法先满足了11g UNPIVOT对常量别名的要求,再通过字符串拼接得到目标格式,逻辑清晰且效率不错。
方法2:用UNION ALL手动展开数据(兼容所有低版本)
如果觉得UNPIVOT的写法有局限,也可以用UNION ALL把每个月份的数据单独查询后合并,这种方式更直观,完全不会有版本限制:
SELECT city, state, year || '-01' AS ID_TIMESPAN, jan AS USD FROM table1 UNION ALL SELECT city, state, year || '-02' AS ID_TIMESPAN, feb AS USD FROM table1 UNION ALL SELECT city, state, year || '-03' AS ID_TIMESPAN, mar AS USD FROM table1 ORDER BY city, state, ID_TIMESPAN;
执行上面任意一种代码,都能得到你期望的输出结果:
CITY STATE ID_TIMESPAN USD city1 state1 2017-01 1 city1 state1 2017-02 2 city1 state1 2017-03 3 city9 state9 2018-01 11 city9 state9 2018-02 12 city9 state9 2018-03 13
内容的提问来源于stack exchange,提问作者Sachin S
相关产品推荐
相关产品推荐

