Oracle 11G新增的SQL语法Pivot用来做行列转换非常方便实用,今天使用的时候却发现一个问题。
如果一个表中有多个数值字段,只对其中一个字段进行Sum的情况下,本来应该转换后为一行的内容,被分成了多行。
Create table 病人预交记录T(id number(8),结算方式 varchar2(20),冲预交 number(16,5));
Insert Into 病人预交记录T
Select 1, '现金', 123 From Dual
Union All
Select 2, '支票', 1000 From Dual
Union All
Select 3, '信用卡', 500 From Dual;
Select "现金", "支票", "信用卡"
From 病人预交记录T
Pivot(Sum(冲预交) For 结算方式 In ('现金' As "现金", '支票' As "支票", '信用卡' As "信用卡"));
--------------------------------------------------------------------------------------------
现金 支票 信用卡
1 123
2 500
3 1000
执行下面的语句,删除表中的id字段的值,查询结果如下:
update 病人预交记录T set id=null;
--------------------------------------------------------------------------------------------
现金 支票 信用卡
1 123 1000 500
这才是实际想要的结果。
为什么会这样呢?
经分析发现,Pivot(Sum(冲预交)...,虽然只求了"冲预交"这个字段的值,但只要表中还有其它的数值类型,就会影响查询结果。
很可能这是11G的一个BUG,所以,要使结果符合预期,最好使用子查询,将结果集限定为只有所求汇总字段一个数值型。
Select "现金", "支票", "信用卡"
From (Select 结算方式, 冲预交 From 病人预交记录T)
Pivot(Sum(冲预交) For 结算方式 In ('现金' As "现金", '支票' As "支票", '信用卡' As "信用卡"))
--------------------------------------------------------------------------------------------
现金 支票 信用卡
1 123 1000 500