打对了

实践Oracle优化技术在医疗信息化中的深入应用,探索医院信息系统性能优化设计之道。公众号:医信系统性能优化。

 

使用Pivot进行行列转换不能合并为一行的问题

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

posted on 2009-03-19 15:55  知道得越多知道的越少  阅读(963)  评论(0编辑  收藏  举报

导航