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

一、行转列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线程的工作基于一个简单的队列系统,任务会被保存到队列中直到线程空闲,一旦空闲队列就被重新提取出来运行 ...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526491.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python安装poi第三方库_使用Python获取城市POI数据

1.数据接口:本次使用百度地图开放平台中的地点检索API来获取城市POI数据,此次以矩形区域检索为例。2.获取思路:因为百度出于数据保护目的,单次访问服务最多同时返回400条数据,不过官方也给出了解决方案,即通…

oracle 对两列加唯一性束_oracle中创建unique唯一约束(单列和多列) 。

oracle中的unique约束是用来保证表中的某一类,或者表中的某一类组合起来不重复的一种手段。我们在可以在创建表时或者创建好后通过修改表的方式来创建oracle中的unique约束。下面是一些创建unique约束的例子:create table unique_test(id number,fname varchar2(20)…

foc 电流环解耦_永磁同步电机矢量控制的解耦及电流环的设计

闸的情况下,系统的初始加速度均为LTJ,如此看来,不管如何优化设定系统的参数,能够改变的仅仅是加速度的变化模式及其经历过程的时间长短,而其最大加速度数值是无法改变的。实际系统当然不会这么理想,至少传…

vivoy9s怎么设置返回键_vivoy9s怎么设置返回键 可以使用虚拟导航键

vivoy9s是支持全面屏手势的,若用户想要返回操作的话,主要看用户选择的手势导航方式,一般来说可以通过上滑返回到手机桌面,当然了,若用户不习惯手势导航,可以设置虚拟导航键,这样的话手机屏幕下方…

1万并发服务器配置_小程序后端服务器搭建:云服务器配置(1)

起因最近在搞小程序,有一个留言与图片上传并展示的功能,用小程序自带云服务器也可以实现,但如果与别的端进行多端互动就需要一个服务器来做为后端,进行图片与留言的上传,并把留言内容和上传后的图片地址保存到sql数据库…

cgo的效率 golang_golang CGO FAQ TIPS : cgo 从 C 传递 slice 到 go

cgo 从 C 传递 slice 到 go这里一般会用在c的callback中。需要加一个wrapper,比直接调用go函数中间多了一个转换步骤,但方便了许多。执行流程为,c调用发起 -> c wrapper -> go export.go://export a_function_callbackfunc a_function_…

php 图片印章_php工具型代码之印章抠图

能将白底红字的印章抠出来,用的是php,框架是laravel,其他框架请自行调节。扣其他颜色也可以,把里面的那段rgb参数判断改改就行了,最后抠出来的效果就是白底变透明,然后只留下红色的章,放在其他页…

vb mysql_VB连接MYSQL实例

VB连接MYSQL实例电脑需安装数据库mysql server和mysql connector net相关版本软件。在工程的‘项目’-‘添加引用’中添加引用‘mysql.data’实现代码如下:Imports System.IOImports SystemImports System.DataImports System.Windows.FormsImports MySql.Data.MySq…

c web mysql数据库_C连接Mysql数据库代码

//vc工具中添加E:\WAMP\BIN\MYSQL\MYSQL5.5.8\LIB 路径//在工程设置-》链接》库模块中添加 libmysql.lib#include #include #include #include #include "E:\wamp\bin\mysql\mysql5.5.8\include\mysql.h"void main(){MYSQL *conn;MYSQL_RES *res;MYSQL_ROW row;char …

ext 如何判断是否是整数_Excel表格技巧—如何用ISNUMBER判断是否是数值

在EXCEL的单元格中,有些单元格为填写的不是数值,在某些情况下,会影响计算结果,例如,以下的表格中,红框内的单元格一个是输入了一个空格,另一个“—”符号,后面平均值的计算未将该单元…

ensp安装对电脑配置要求高吗_直线导轨有哪些安装方法?为什么直线导轨安装精度要求高?...

要点:1、为什么直线导轨安装精度要求高;2、直线导轨的安装流程;3、直线导轨不同安装方法介绍。点击链接加入群聊【solidworks机械设计学习】:正在跳转​jq.qq.comhttps://www.zhihu.com/video/1197242052088516608

mysql查看版本号_十分钟了解MySQL事务机制

读书百遍其义自现。MySQL数据库在我们平时工作学习中的使用频率是相当之高,彻底掌握MySQL的事务机制对我们平时工作会有非常大的帮助,仔细回忆一下,你是否对MySQL事务相关的知识是否完全掌握?是否感觉有的地方有些模糊&#xff1f…

mysql 字符串类型 分区_MySQL分区类型

博文大纲:1、RANGE分区2、LIST分区3、HASH分区4、key分区5、MySQL分表和分区的区别6、附加:如何实现将分区放在不同的目录下进行存储MySQL分区类型如下:RANFGE分区LIST分区HASH分区key分区上面的四种分区的条件必须是整形,如果不是…

h5获取http请求头_nodejs 中http请求头,响应头

-------------------- 1.request常见的属性 -----------------------var httprequire("http");var serverhttp.createServer(); //创建服务器server.on("request",function(req,res){// request.headers 打印全部请求头信息--对象形式// request.rawHeader…

mysql邮箱认证_邮件服务系列postfix+sasl+mysql实现用户认证功能

1、卸载bind[rootmail ~]# rpm -e bind-utils2、安装bind97-utils bind97-libs bind97[rootmail ~]# yum install bind97 bind97-utils #bind97-libs依赖于utils3、启动dns服务[rootmail ~]# service named start4、编写配置文件和区域数据文件[rootmail ~]# vim /etc/named.…

python多进程队列中的队列_python 多进程队列数据处理详解

我就废话不多说了,直接上代码吧!# -*- coding:utf8 -*-import paho.mqtt.client as mqttfrom multiprocessing import Process, Queueimport time, random, osimport camera_person_numMQTTHOST "172.19.4.4"MQTTPORT 1883mqttClient mqtt.…

UOS nginx

 安装 nginx 软件包;  配置文件名为 ispweb.conf,放置在/etc/nginx/conf.d/目录下;  网站根目录为/mut/crypt(目录不存在需创建);  启用 FastCGI 功能,让 nginx 能够解析 php 请求&a…

mysql数据库重做日志文件_mysql数据库重做日志

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户…

mysql免安装如何改密码_mysql免安装版配置与修改密码的教程

第一步:配置环境变量(我的解压路径:G:\mysql\mysql-5.7.21-winx64 )MYSQL_HOME你解压的路径PATH ;%MYSQL_HOME %\bin;PATH变量是在原来的基础上多添加的,不要把其它的设置给删掉了第二步在解压的目录下添加my.ini 文件(如果已经有了这个文件&#xff0c…

unix 登录mysql_实例分析mysql用户登录。

今天,在学习mysql授权认证时,遇到了一个问题,看下,我是如何分析的:我在数据库内添加了一个帐号:create databases firstdb;grant all on firstdb.* to ‘firstdb’’’ identified by ‘xxxxx’;flush priv…