一、行转列pivot

关键函数pivot,其用法如下 pivot(聚合函数 for 列名 in(类型))

select * from table_name pivot(max(column_name)                            --行转列后的列的值value,聚合函数是必须要有的

for column_name in(value_1,value_2,value_3)     --需要行转列的列及其对应列的属性1/2/3

)

1、首先举一个简单的例子,创建一个数据表

create table tmp as select * from (

select '张三' student,'语文' course ,78 score from dual union all

select '张三','数学',87 from dual union all

select '张三','英语',82 from dual union all

select '张三','物理',90 from dual union all

select '李四','语文',65 from dual union all

select '李四','数学',77 from dual union all

select '李四','英语',65 from dual union all

select '李四','物理',85 from dual);

先使用decode或case when方法

select

student,

max(decode(course, '语文', score)) 语文,

max(decode(course, '数学', score)) 数学,

max(decode(course, '英语', score)) 英语,

max(decode(course, '物理', score)) 物理,

sum(score) total

from tmp

group by student;

-----------------------------------------

select

student,

max(case when course = '语文' then score end) 语文,

max(case when course = '数学' then score end) 数学,

max(case when course = '英语' then score end) 英语,

max(case when course = '物理' then score end) 物理,

sum(score) total

from tmp

group by student;

pivot的使用

select t.*,

(t.语+t.数+t.外+t.物) as total

from

(select *

from tmp pivot ( max(score) for course in ('语文' as 语 , '数学' as 数, '英语' as 外,'物理' as 物) )

) t;

结果同上

2、实际开发遇到的问题

有一张目标值表,年、月、日的值都是分开多行显示,现需合并成一行显示,具体数据如下:(type:1-->日,2-->月,3-->年;targetvalue:目标值)

select * from MOVEBI.T_GMS_MBI_TARGET_DATA where targetcode = '31227061'

此数据必须先进性处理,要保证数据可以聚合成一条,若直接使用会出现下列情况:

select * from MOVEBI.T_GMS_MBI_TARGET_DATA pivot(max(targetvalue) for type in (1 day_value,2 mon_value,3 year_value)) where targetcode = '';

这不是我们想要的结果,具体改进法法如下:

--方法一:对结果处理

select max(datatime) datatime

,usercode

,deptcode

,deptname

,targetcode

,targetname

,sum(coalesce(day_value,0)) day_value

,sum(coalesce(mon_value,0)) mon_value

,sum(coalesce(year_value,0)) year_value

from(

select datatime,usercode,deptcode,deptname,targetcode,targetname,day_value,mon_value,year_value

from MOVEBI.T_GMS_MBI_TARGET_DATA

pivot(max(targetvalue) for type in (1 day_value,2 mon_value,3 year_value)) where targetcode = '')

group by usercode

,deptcode

,deptname

,targetcode

,targetname;

--方法二:对原始表处理

select *

from (select '' datatime,

usercode,

deptcode,

deptname,

targetcode,

targetname,

targetvalue,

type

from MOVEBI.T_GMS_MBI_TARGET_DATA

where datatime in ('', '')

and targetcode = '') t

pivot(max(targetvalue) for type in (1 day_value,2 mon_value,3 year_value)) where targetcode = '';

二、列转行unpivot

根据上面的例子创建tmp_2测试用表

select student,科目,成绩 from tmp_2 unpivot (成绩 for 科目 in (语文, 数学, 英语, 物理));

同样不使用unpivot也可以实现同样的效果,只是sql语句会很长,而且执行速度效率也没有前者高

select student,'语文' 科目, (select 语文 from tmp_2 where student=f.student) 成绩 from tmp_2 f

union

select student,'数学' 科目, (select 数学 from tmp_2 where student=f.student) 成绩 from tmp_2 f

union

select student,'英语' 科目, (select 英语 from tmp_2 where student=f.student) 成绩 from tmp_2 f

union

select student,'物理' 科目, (select 物理 from tmp_2 where student=f.student) 成绩 from tmp_2 f

-------------------------------------------

select student,'语文' 科目,语文 from tmp_2

union

select student,'数学' 科目,语文 from tmp_2

union

select student,'英语' 科目,语文 from tmp_2

union

select student,'物理' 科目,语文 from tmp_2

(注:此为学习记录笔记,仅供参考若有问题请指正,后续补充......)

参考文档:https://blog.csdn.net/xiaokui_wingfly/article/details/42419207

参考文档:https://www.cnblogs.com/harvey888/p/6735093.html

参考文档:https://www.cnblogs.com/markfeifei/p/4009343.html

oracle行列转换函数的使用

oracle 10g wmsys.wm_concat行列转换函数的使用: 首先让我们来看看这个神奇的函数wm_concat(列名),该函数可以把列值以","号分隔起来,并显示成一行 ...

Oracle11g 行列转换函数PIVOT and UNPIVOT

作为Oracle开发工程师,推荐大伙看看 PIVOT and UNPIVOT Operators in Oracle Database 11g Release 1 This article shows ...

oracle 行列转换函数之WM_CONCAT和LISTAGG的使用(一)

一.wm_concat函数 wm_concat能够实现同样的功能,但是有时在11g中使用需要用to_char()进行转换,否则会出现不兼容现象(WMSYS.WM_CONCAT: 依赖WMSYS 用户, ...

Oracle行列转换

一.建表与插入数据 1.1.建表 create table kecheng ( id NUMBER, name ), course ), score NUMBER ); insert into kec ...

oracle 行列转换

oracle 行列转换列名如果是数字,用双引号包住  如下: --  建表 create table workinfo(wid integer primary key,sid integer ,CON ...

Oracle 大小写转换函数

Oracle 大小写转换函数 转大写UPPER 转小写LOWER 测试: select UPPER('Test') as u from dual; select LOWER('Test') as l ...

SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例,合并列的例子

使用过SQL Server 2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQL Server 2005中,使用新引进的关键字PIVOT/UN ...

行列转换小结 Pivot ,Unpivot (转,改)

行专列 Pivot 1)SQL 2000版本 静态 SELECT ID , SUM(CASE Code WHEN 'Item1' THEN Value END) AS Item1 , SUM(CASE ...

Oracle行列转换的思考与总结

最近几天一直在弄Oracle-SQL的问题,涉及到了一些平时没有用到的东西,也因此而在这里郁闷了好久.现在问题得到了解决虽说不算完美.但是还是和大家一起分享一下. 行列转换之一:sum(case wh ...

随机推荐

how to javafx hide background header of a tableview?

http://stackoverflow.com/questions/12324464/how-to-javafx-hide-background-header-of-a-tableview ———— ...

c#的方法重写和的java方法重写有什么区别

java code: package example; class m1 { public int getInt() { return 0; } } class m2 extends m1 { pub ...

cocos2d-x plist+wen使用

http://zhan.renren.com/tag?value=cocos2dx&from=template http://blog.csdn.net/zhanglongit/article ...

第三周博客之二---Oracle中的sql语句

一.用户及权限(DBA有最高系统权限) 1.数据库的安全性:系统的安全性.数据的安全性 2.权限分类: 2.1系统权限:获得后可访问数据库 常用的有create table,create user,c ...

python爬虫之pyquery学习

相关内容: pyquery的介绍 pyquery的使用 安装模块 导入模块 解析对象初始化 css选择器 在选定元素之后的元素再选取 元素的文本.属性等内容的获取 pyquery执行DOM操作.css ...

JAVA 设计模式遵循的六大基本准则

JAVA 设计模式遵循的六大基本准则 一.单一职责原则:(Single Responsibility Pinciple)  一个类只负责一项职责. 当超过一项职责需要负责时,需要增加新的类来负责新的职 ...

[洛谷 P3787] 冰精冻西瓜

题目描述 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有根树,琪露诺想要把它们冷冻起来慢慢吃. 这些西瓜蔓具有神奇的性质,可以将经过它的 ...

高性能JavaScript(快速响应的用户界面)

浏览器UI线程 用于执行JavaScript代码和更新界面的进程被称为 “浏览器UI线程” . UI线程的工作基于一个简单的队列系统,任务会被保存到队列中直到线程空闲,一旦空闲队列就被重新提取出来运行 ...

oracle非常量不能用于privot_Oracle 行列转换函数pivot、unpivot的使用(二)相关推荐

  1. oracle非常量不能用于privot_Oracle 行转列(pivot、wm_concat、decode)使用总结(转载)...

    偶然需要了解,学习了这篇文章,转载记录一下 自:http://blog.csdn.net/jxzkin/article/details/7949629 1.创建测试数据CREATE TABLE CC ...

  2. oracle非常量不能用于privot_Oracle(二)

    单行函数:只有一个参数输入,只有一个结果输出 多行函数或分组函数:可有多个参数输入,只有一个结果输出 1.测试lower/upper/initcap函数,使用dual哑表 select lower(' ...

  3. Oracle 行列转换函数pivot使用

    问题描述: 描述:在项目中,需要将表中日期数据行,用视图转列显示月报表 解决方案: 注意:多聚合必须重命名. create table pivottest( 主键 varchar2(50) defau ...

  4. oracle 总转横函数,详解Oracle行列转换函数-pivot函数和unpivot函数-多智时代

    今天主要介绍一下Oracle行转列及列转行常见函数,下面一起来看看吧! 行列转换 pivot函数:行转列函数 语法:pivot(任一聚合函数 for 需专列的值所在列名 in (需转为列名的值)): ...

  5. oracle 的行列转换函数,Oracle行列转换函数

    VM_CONCAT vm_concat可以用来进行行转列,默认以逗号分隔,可通过vm_concat(name,',','|')修改为|1 2 3 4 5 6 7 8 9 10 11 12 13SQL& ...

  6. mysql unpivot_SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例,合并列的例子...

    使用过SQL Server 2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQL Server 2005中,使用新引进的关键字PIVOT/UN ...

  7. oracle转换为16进制,Oracle的十进制和16进制转换函数

    Oracle的10进制和16进制转换函数 在数据库中,常常需要将10进制转16进制,又会需要将16进制转10进制.有两个使用PL/SQL开发的函数,可以方便使用. create or replace ...

  8. Excel·VBA数组行列转换函数

    目录 1,二维数组与一维嵌套数组互相转换函数 2,二维数组转换为指定行数/列数的函数 3,数组行列转置函数 1,二维数组与一维嵌套数组互相转换函数 <Excel·VBA数组组合函数.组合求和&g ...

  9. 【Oracle 数据库】奶妈式教程 day14 转换函数

    转换函数 1.ASCII(str) 把一个字符转换成一个 ASCII 码 SELECT ASCII('a') FROM DUAL; 2.CHR(num) 根据ascii 转换成对应的97字符 SELE ...

最新文章

  1. 服务国内超过70%游戏公司,腾讯游戏云发布游戏行业最全解决方案
  2. 炼数成金数据分析课程---8、数据清洗
  3. 用 Flask 来写个轻博客 (14) — M(V)C_实现项目首页的模板
  4. websocket 安全_将Websocket与Spring Framework和Vuejs结合使用
  5. 通过document id和content拿到SAP document的binary data
  6. 和套套一样,一次性橡胶手套制作现场, 这鬼畜的画风
  7. 作为一个上市公司HR,跟大家分享一些面试的真相
  8. hashmap remove 没释放内存_java从零开始手写 redis(13)HashMap 源码原理详解
  9. 小学教育专业有计算机课程吗,小学计算机课程教学工作总结
  10. PDF.js插件 | 在线PDF阅读插件,支持手机在线阅读
  11. h5页面制作软件html包,iH5专业H5页面制作工具网页版
  12. Linux 音频编程 -- 如何使用ALSE库播放wav文件
  13. of介词短语作定语_在英语句子中,介词短语都能做什么用?作定语?作表语?作状语?...
  14. 开发者百宝箱——DevToys
  15. 新一代防泄密系统即将发布
  16. mmdetection训练、测试
  17. 太火爆了!这一款小游戏火到把服务器搞瘫痪,合成大西瓜
  18. 39-网上商城数据库-用户信息数据操作
  19. Java ZIP压缩输入输出流
  20. Ubuntu如何安装pacman

热门文章

  1. 阿里开发者们的第16个感悟:让阅读源码成为习惯
  2. 安全看得见,阿里云性能监控 ARMS 全真3D拓扑实现一“屏”了然
  3. 【实操手册】如何把一场直播录制下来?
  4. 曦智科技发布最新光子计算处理器PACE
  5. 腾讯首度披露基础架构演进史:“海量之道”进化“生而为云”
  6. 数据可视化图表,你选对了吗?
  7. Storm精华问答 | task与executor有什么关系?
  8. git 撤销挂起的更改_小姐姐带你用Git
  9. python接口测试实战_Python接口测试实战01:七种武器
  10. uni-app集成uview