• 使用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

  • 相关阅读:
    14、数列
    13、Hangover
    12、Anagrams by Stack
    彩票软件7) 重构数据库accesser
    彩票软件6)观察者模式
    彩票软件5)Sqlite 数据库访问类
    彩票软件4)插叙
    彩票软件3)wpf界面布局
    彩票软件2)代码管理git
    彩票软件1)前言
  • 原文地址:https://www.cnblogs.com/zyk/p/1416868.html
Copyright © 2020-2023  润新知