oracle 学习之 unpivot/pivot函数及hive实现该功能

Oracle中pivot函数详解_实泽有之,无泽虚之的博客-CSDN博客pivot函数格式:pivot(聚合函数 for 需要转为列的字段名 in(需要转为列的字段值));pivot函数说明:实现将指定字段的值转换为列的效果。https://blog.csdn.net/qq_40018576/article/details/128287105

oracle 总转横函数,详解Oracle行列转换函数-pivot函数和unpivot函数-多智时代_吴寿鹤的博客-CSDN博客今天主要介绍一下Oracle行转列及列转行常见函数,下面一起来看看吧!行列转换pivot函数:行转列函数语法:pivot(任一聚合函数 for 需专列的值所在列名 in (需转为列名的值));unpivot函数:列转行函数语法:unpivot(新增值所在列的列名 for 新增列转为行后所在列的列名 in (需转为行的列名));执行原理:将pivot函数或unpivot函数接在查询结果集的后面。相当...https://blog.csdn.net/weixin_30899789/article/details/116470147

pivot和unpivot函数_weixin_34168700的博客-CSDN博客今天小编整理的都是固定行转列(列转行)的例子!一:unpivot列转行函数举例演示:创建一张表tmp_test,数据如图所示代码展示:select code,name,cource,grade from tmp_test unpivot(grade for source in (chinese,math,english));数据结果展示:二:pivot行转列函数举例演示:创建一张表tmp_te...https://blog.csdn.net/weixin_34168700/article/details/93016924 

pivot行转列函数

unpivot列转行函数

总结:
pivot函数:行转列函数:
  语法:pivot(任一聚合函数 for 需专列的值所在列名 in (需转为列名的值));
unpivot函数:列转行函数:
  语法:unpivot(新增值所在列的列名 for 新增列转为行后所在列的列名 in (需转为行的列名));
执行原理:将pivot函数或unpivot函数接在查询结果集的后面。相当于对结果集进行处理。

在学习之前,我个人觉得很多时候行转列 列转行,一行转多行,一列变多列,这些概念都不是很清楚

先看看网上说法 行转列、列转行 - 知乎

所谓行转列,即将一行数据转成多行显示,或者说将多列数据转成一列显示。通常将转化后的列名为某一行中某一列的值,来识别原先对应的数据

所谓列转行,即将多行转为一行显示,或者说将一列转为多列显示。通常转化后将某一列distinct后的值作为列名,将此值对应的多行数据显示成一行

 又有人评论说上面的说法反了

行转列:
即将多行一列数据转为一行多列显示。通常转化后将某一列分类后的值作为新的列名,将此值对应的多行数据显示成一行。
列转行:
即将一行多列数据转成多行一列显示。通常将转化后的列名为某一行中某一列的值,来识别原先对应的数据。

搞得我也迷惑了。再次搜索MySQL的行转列与列转行_什么是 列转行、行转列_¥程序猿¥的博客-CSDN博客 

 这里有句话说的好,

行转列 就是行数少了列数多了。

列转行 就是列数少了行数多了。

一列转多列 就是行数不变,列数多了

一行转多行 就是列数不变,行数多了

所以这才是真正的概念,因为a转b 肯定是a转化为b,一个少一个多。

——————————————————————————————————————————

pivot语法个人总结为 

select * from table  pivot(  --注意这里啊 pivot函数是对 table 进行行转列 table pivot是一个整体

聚合函数(column1)  --column1你要聚合的字段             

for column2 in (       --column2 是你要转成列的字段。比如下面的 COL_X 我要转列

        value1 as newcolumn1 , -- value1 value2 必须是column2的值

        value2 as newcolumn2

        )

)

数据准备

create table test.test_pivot(name varchar2(10),subject varchar2(10),score int);

INSERT INTO test.test_pivot
SELECT * FROM (
select 'cc1','语文',12 from dual union all
select 'cc1','数学',24 from dual union all
select 'cc1','英语',44 from dual union all
select 'cc2','语文',12 from dual union all
select 'cc2','数学',24 from dual union all
select 'cc2','英语',44 from dual union all
select 'cc3','语文',12 from dual union all
select 'cc3','数学',24 from dual union all
select 'cc3','英语',44 from dual union all
select 'cc4','语文',12 from dual union all
select 'cc4','数学',24 from dual union all
select 'cc4','英语',44 from dual union all
select 'cc5','语文',12 from dual union all
select 'cc5','数学',24 from dual union all
select 'cc5','英语',44 from dual union all
select 'cc6','语文',12 from dual union all
select 'cc6','数学',24 from dual union all
select 'cc6','英语',44 from dual union all
select 'cc7','语文',12 from dual union all
select 'cc7','数学',24 from dual union all
select 'cc7','英语',44 from dual union all
select 'cc8','语文',12 from dual union all
select 'cc8','数学',24 from dual union all
select 'cc8','英语',44 from dual union all
select 'cc9','语文',12 from dual union all
select 'cc9','数学',24 from dual union all
select 'cc9','英语',44 from dual union all
select 'cc10','语文',12 from dual union all
select 'cc10','数学',24 from dual union all
select 'cc10','英语',44 from dual
)

--如果oracle执行失败因为是csdn复制的时候多了空格。。自己处理

开始实战。

 SELECT * FROM test.test_pivot

 ----这里我先说下 为什么要行转列??什么情况下需要行转列,各位考虑过没有? 

这张图和上面那张图 都能够看到学生的各科成绩,但是下面的图看起来更加直观一点,是不是更好呢? 我觉得不一定,因为每个人看待问题得角度不一样。

其实要是吹牛逼的话 还可以说下,存储的数据大小不一样,

最上面的是3*10 主要存的是 cc1 英语 12

下面的是4*10 主要寸的是cc1 24 12 44  

上面的英语两个汉字占的空间可比下面占的多点。

好了直接实战。

1.显示每个学生的各科成绩

SELECT * FROM test.test_pivot pivot( 
sum(score)   
FOR subject IN ('数据','英语','语文')
)

 --这里还是注意 这个函数pivot 和table还是一起的,说明是对整张表去列转行

--这个sum 啥用没有 你换成 avg min max 都一样

如何用hive表示呢?hive没有这类函数 直接group by 来处理

hive版本

SELECT NAME,
sum(CASE SUBJECT WHEN '语文' THEN  SCORE ELSE 0 END  ) AS yuwen,
sum(CASE SUBJECT WHEN '数学' THEN  SCORE ELSE 0 END  )AS shuxue,
sum(CASE SUBJECT WHEN '英语' THEN  SCORE ELSE 0 END  ) AS yingyu
FROM test.test_pivot
GROUP BY NAME

--这也没啥好说的,就是注意一个问题 这里也用了sum 其实换做avg max也行 min就算了。

select*FROM  test.test_pivot pivot
(
sum(score)
FOR name IN(
'cc1','cc2','cc3','cc4','cc5','cc6','cc7','cc8','cc9','cc10'
)
)

这种类似上面的。

SELECT subject,
sum(CASE name WHEN 'cc1'  THEN  SCORE ELSE 0  END)  AS cc1,
sum(CASE name WHEN 'cc2'  THEN  SCORE ELSE 0  END)  AS cc2,
sum(CASE name WHEN 'cc3'  THEN  SCORE ELSE 0  END)  AS cc3,
sum(CASE name WHEN 'cc4'  THEN  SCORE ELSE 0  END)  AS cc4,
sum(CASE name WHEN 'cc5'  THEN  SCORE ELSE 0  END)  AS cc5,
sum(CASE name WHEN 'cc6'  THEN  SCORE ELSE 0  END)  AS cc6,
sum(CASE name WHEN 'cc7'  THEN  SCORE ELSE 0  END)  AS cc7,
sum(CASE name WHEN 'cc8'  THEN  SCORE ELSE 0  END)  AS cc8,
sum(CASE name WHEN 'cc9'  THEN  SCORE ELSE 0  END)  AS cc9,
sum(CASE name WHEN 'cc10' THEN  SCORE ELSE 0  END)  AS cc110
FROM test.test_pivot
group by subject 

--反正就是group by

2.显示每个学生的总成绩

select*FROM
(SELECT name,score from test.test_pivot) pivot
(
sum(score)
FOR name IN(
        'cc1','cc2','cc3','cc4','cc5','cc6','cc7','cc8','cc9','cc10'
        )
)

hive 如何实现呢?

第一步 先求sum总分

SELECT name,sum(score) from test.test_pivot
GROUP BY name 


WITH tmp AS (SELECT name ,sum(score ) score  FROM test.test_pivot GROUP BY name) 
SELECT 
sum(CASE name WHEN 'cc1' THEN SCORE ELSE 0 END) AS cc1, 
sum(CASE name WHEN 'cc2' THEN SCORE ELSE 0 END) AS cc2, 
sum(CASE name WHEN 'cc3' THEN SCORE ELSE 0 END) AS cc3, 
sum(CASE name WHEN 'cc4' THEN SCORE ELSE 0 END) AS cc4, 
sum(CASE name WHEN 'cc5' THEN SCORE ELSE 0 END) AS cc5, 
sum(CASE name WHEN 'cc6' THEN SCORE ELSE 0 END) AS cc6, 
sum(CASE name WHEN 'cc7' THEN SCORE ELSE 0 END) AS cc7, 
sum(CASE name WHEN 'cc8' THEN SCORE ELSE 0 END) AS cc8, 
sum(CASE name WHEN 'cc9' THEN SCORE ELSE 0 END) AS cc9 
FROM tmp 
GROUP BY 1

反正就是这么个语法 我的不一定最好,只是一个思路。

unpivot

语法

select * from table  pivot(  --注意这里啊 pivot函数是对 table 进行行转列 table pivot是一个整体

聚合函数(column1)  --column1你要聚合的字段             

for column2 in (       --column2 是你要转成列的字段。比如下面的 COL_X 我要转列

        value1 as newcolumn1 , -- value1 value2 必须是column2的值

        value2 as newcolumn2

        )

)

数据准备 

直接将pivot的数据转化下久iu是unpivot的了 这两个函数本身就是相互转化的。

CREATE TABLE test.test_unpivot AS 
SELECT * FROM test.test_pivot pivot(sum(score)FOR subject IN ('数学' AS 数学,'英语' AS 英语,'语文' AS 语文 ))
--这里注意有个坑,一般来说汉字 我们都要打引号的,oracle这里不需要。 如果你不 加as别名,你最后的字段名就是'数学'而不是 数学

--里面的分数我自己随便改了点 不影响。

 

unpivot简单使用 行转列之一行转多列

select name,subject,grade from test.test_unpivot  UNPIVOT(
    grade for subject in(数学,英语,语文)) 

 

如何用hive语法,其实说mysql语法也行。实现如上功能呢? 

上面行转列pivot 我们都是采用group by

那么列转行unpiovt 一般都是采用 union all。

 SELECT * 
    FROM (
    SELECT name ,'数学',数学 FROM test.test_unpivot UNION ALL 
    SELECT name ,'语文',语文 FROM test.test_unpivot UNION ALL 
    SELECT name ,'英语',英语 FROM test.test_unpivot
    ) ORDER BY name 

就这样吧

总结下

pivot 我们在hive就用 case when +group by 来实现

unpivot我们在hive就用 union all来实现 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Win11的两个实用技巧系列之关闭分屏模式方法

怎么关闭Win11电脑分屏模式?Win11关闭分屏模式方法 有用户在使用电脑的时候不小心开启了电脑的分屏模式,导致自己无法正常的进行电脑操作了,本文就为大家带来了Win11关闭分屏模式方法,一起看看吧 Win11电脑分屏模式怎么关闭?有用…

千万不要乱操作了!医院机房这么做真高级

各类中心数据机房广泛分布于银行、库房、交通、电信、医院、教育等行业。系统故障和人为操作不当可能导致各种业务中断或数据丢失,进而影响企业业务的停滞和运行。 医院管理3大难题和挑战 01.缺乏预警、告警机制 医院在使用自动化监控系统之前,主要靠人…

【JVM】1. JVM与Java体系结构

文章目录 1.1. 前言🍉1.2. 参考书目🍉1.3. Java及JVM简介🍉1.4. Java发展的重大事件🍉1.5. 虚拟机与Java虚拟机🍉1.6. JVM的整体结构🍉1.7. Java代码执行流程🍉1.8. JVM的架构模型🍉…

MongoDB 查询文档中使用正则选择器($regex)

之前我们介绍过使用文本选择器($text)查询文档,如果您需要进一步了解,可以参考: MongoDB 查询文档中使用文本选择器($text)https://blog.csdn.net/m1729339749/article/details/130605491 本篇…

进程概念

目录 冯诺依曼体系结构 操作系统OS 系统调用和库函数概念 进程 task_struct内容分类 组织进程 初识fork 进程状态 Z(zombie)-僵尸进程 孤儿进程 进程优先级 环境变量 和环境变量相关的命令 环境变量的组织方式 程序地址空间 冯诺依曼体系结构 关于冯诺依曼&…

制定进度计划是成功项目管理的必由之路

项目经理王斌接到一个新项目,与各项目干系人没有建立有效的联系,他们无法了解项目进展情况。甚至连项目团队的参与人员自身对项目整体情况也没有清楚的认识,而只管自己那一部分,整个开发过程完全是一种黑盒模式,项目组…

windows提权

权限提升概述 1、提权介绍 权限提升:攻击者通过安全漏洞把获取到的受限制的低权限用户突破限制,提权至高权限的管理员用户,从而获取对整个系统的控制权 windows:user --> system/administrator linux:user --&g…

5th-Generation Mobile Communication Technology(五)

目录 一、5G/NR 1、 快速参考(Quick Reference) 2、5G Success 3、5G Challenges 4、Qualcomm Videos 二、PHY and Protocol 1、Frame Structure 2、Numerology 3、Waveform 4、Frequency Band 5、BWP 6、Synchronization 7、Beam Management 8、CSI Fra…

超细!从零安装压测工具 jmeter(附JDK下载安装教程,20230516的JDK8最新版)

两步走,安装 JDK 和 jmeter,如果安装了JDK的同志可以直接看第二步。 针对的操作系统:Windows。 下载JDK 官网指路(处于稳定性考虑,安装的JDK8): Java Downloads | Oraclehttps://www.oracle.c…

MySQL学习(基础篇1.0)

MySQL概述(基础) SQL 全称Structured Query Language,结构化察浑语言。操作关系型数据库的编程语言,定义了一套操作关系型数据库的统一标准。 SQL通用语法 SQL语言的统统用语法: SQL语句可以单行或多行书写,以分号…

数字化赋能,探索智慧银行建设的最佳实践

导语 | 数字经济时代,数字化已成为银行业转型升级的战略手段。近年来,商业银行纷纷加大对信息科技的投入,数字化在改变银行业务模式的同时,更是构建起了数字金融新生态。今天,我们特邀腾讯云 TVP 行业大使、舜源科技合…

安科瑞电能表对于预付费平台的费控策略应用

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘要:基于智能电能表的预付费系统平台可以实现对预付费客户的适时算费、远程费控和服务。预付费系统的费控策略包括算费子策略、催费预警提醒子策略、欠费停电子策略,介绍3个子策略的制定原则、设计流程&…

电脑怎么截图?常见的4种截图方法分享!

案例:有人知道在电脑上怎么截图? 【有时候,用截图表达事情会更加清楚,但是我只会手机截图,不知道在电脑上怎么截图。有没有小伙伴知道电脑怎么截图?】 在日常使用电脑时,我们经常需要截图来记…

java+springboot高校校友校园信息管理系统

本高校校友信息管理系统使用Web开发,运行在Internet环境之上,系统的后台编程语言使用JAVA,数据库使用MySQL。完成了两个用户角色的功能,管理员管理所有信息,前台学生用户登录后查看公告,在线捐赠申请&#…

java版企业电子招投标采购系统源码——功能模块功能描述+数字化采购管理 采购招投标

​ 功能模块: 待办消息,招标公告,中标公告,信息发布 描述: 全过程数字化采购管理,打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力,为外…

基于K8sSVC springboot 服务间调用

公司项目私有化部署,甲方要求服务间调用使用K8sSVC完成服务间调用。需要把原有基于springbootnacos 服务注册发现改造为k8ssvc完成服务间注册发现。 首先了解一下k8s svc: K8S核心概念之SVC(易混淆难理解知识点总结)_k8s svc_倾…

Push rejected,用Git修改已提交的注释

问题:有时候因注释与git规定的模板不匹配,会导致远程提交被拒绝 Push rejected 解决:修改不符合规范的注释再push即可 1、打开命令窗口 在项目根目录下右键点击出 Git批处理命令窗口。 2、查看已提交的commit 运行命令:git reba…

jpg怎么转换成png格式?四种转换方式试试看

很多时候,我们需要将JPG(Joint Photographic Experts Group)格式转换成PNG(Portable Network Graphics)格式,从而便于图片的使用。那么,将JPG转换成PNG有什么作用呢?首先&#xff0c…

Java集合常见面试题

1、Java集合概述 Java集合,也叫作容器。由两大接口派生而来:Collection接口,用于存放单一元素;Map接口,主要用于存放键值对。对于Collection接口,下面又有三个主要的子接口:List、Set、Queue 2…

CRM系统本地部署和云部署的优缺点

众所周知,CRM系统部署方式有两种,分别是本地部署和云部署。两者各有优缺点,企业可以按照自身的需求来进行选择。下面说说CRM不同部署方式的优缺点。 CRM本地部署 本地部署是指将CRM系统安装在企业自己的服务器上,并由企业自行维…
最新文章