惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
酷 壳 – CoolShell
酷 壳 – CoolShell
WordPress大学
WordPress大学
小众软件
小众软件
博客园 - 司徒正美
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Jina AI
Jina AI
Hugging Face - Blog
Hugging Face - Blog
博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
量子位
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
雷峰网
雷峰网
云风的 BLOG
云风的 BLOG
M
MIT News - Artificial intelligence
F
Fortinet All Blogs
T
Tailwind CSS Blog
Martin Fowler
Martin Fowler
I
InfoQ
The GitHub Blog
The GitHub Blog
有赞技术团队
有赞技术团队
The Cloudflare Blog
罗磊的独立博客

博客园 - 知道得越多知道的越少

window10上登录Oracle时提示ORA-12546:Permission denied 大表的主键创建优化技术(转一篇有深度的文章) Oracle并行执行特性应用初探 解决Rhel5上安装VMWare tools的问题 Oracle 性能诊断艺术 第四章 笔记 Oracle国外站点汇集 在客户端通过外部表访问Trace文件的内容 查出全表扫描的相关SQL语句 SQL条件的顺序对性能的影响 用SQL语句求排除断号的号码串 易用性规范 64位Oracle数据库环境下安装使用32位的PLSQL-Developer 删除Oracle程序,重装后遇到的两个小问题 闪回查询,9i,10G到11G的不断增强 归档日志充满的问题解决 ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务 问题解决 生成SQL记录集的一些数据 导入的数据,删除约束后没有自动删除对应索引,重建约束出错 如何取出某一用户的密码,再原封不动的改回去?
使用Pivot进行行列转换不能合并为一行的问题
知道得越多知道的越少 · 2009-03-19 · via 博客园 - 知道得越多知道的越少

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