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

news2024/11/27 19:52:52

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.coloradmin.cn/o/528913.html

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

相关文章

最新DNDC模型在土地利用变化、未来气候变化下的建模方法及温室气体时空动态模拟实践技术应用

由于全球变暖、大气中温室气体浓度逐年增加等问题的出现,“双碳”行动特别是碳中和已经在世界范围形成广泛影响。。DNDC(Denitrification-Decomposition,反硝化-分解模型)是目前国际上最为成功的模拟生物地球化学循环的模型之一&a…

Flutter报错Building with plugins requires symlink support的解决方法

错误 Building with plugins requires symlink support. Please enable Developer Mode in your system settings. Runstart ms-settings:developers to open settings. 原因 这个错误表示你的系统尚未启用开发者模式,所以无法使用Flutter的插件功能。 Flutter插件会通过符号…

OJ刷题 第十六篇(递推较多,难)

31012 - 贴瓷砖 时间限制 : 1 秒 内存限制 : 32 MB 有一块大小是 2 * n 的墙面&#xff0c;现在需要用2种规格的瓷砖铺满&#xff0c;瓷砖规格分别是 2 * 1 和 2 * 2&#xff0c;请计算一共有多少种铺设的方法。 输入 输入的第一行包含一个正整数T&#xff08;T<20&…

第十三章 使用DHCP动态管理主机地址

文章目录 第十三章 使用DHCP动态管理主机地址一、动态主机地址管理协议1、DHCP简介2、DHCP常见术语 二、部署DHCP服务程序1、安装DHCP服务程序2、配置文件参考模板3、dhcpd服务程序配置文件中常见参数及作用 三、自动管理IP地址1、机房所用的网络地址以及参数信息2、关闭虚拟网…

Agisoft Metashape 红外影像处理

系列文章目录 文章目录 系列文章目录前言一、加载红外影像二、对齐照片三、构建 DEM四、生成 DOM五、温度值可视化前言 Agisoft Metashape 专业版支持处理来自 AscTec(ARA 格式)、WIRIS(TIFF 格式)热成像仪和以 R-JPEG(FLIR 数据)格式保存数据的热成像数据。 在本文中,…

如何编写自动化测试用例,一篇带你解决

自动化测试脚本 什么是自动化测试&#xff1f; 自动化测试是验证和验证软件是否满足所有用户需求&#xff0c;并使用自动化工具按预期运行。它检查在产品开发阶段期间和之后出现的错误、问题和其他类型的缺陷。这种类型的软件测试运行在由测试工具处理的编程脚本上。有多种测…

linux基础(IO)

目录&#xff1a; 1.复习C文件IO相关操作 2.介绍C程序会默认打开3个输入输出流 3.学习文件的系统调用接口 ---------------------------------------------------------------------------------------------------------------------------- 1.复习C文件IO相关操作 fopen函数…

HTTP协议格式及 fiddler 的使用

HTTP 协议格式 简述 HTTP 协议fiddler(抓包工具) 的使用协议格式总结 : 简述 HTTP 协议 HTTP 协议是个使用非常广泛的应用层协议, 应用层协议通常是需要 “自定义协议” 的, 自定义协议可以基于现有协议进行定制, HTTP 之所以应用广泛就是因为其可定制性非常强. 日常生活中遇到…

网络安全工程师的岗位需求,破237万了!

3月底凌晨&#xff0c;腾讯QQ和微信的相关业务都出现了功能异常。 包括微信语音对话、朋友圈、微信支付&#xff0c;以及QQ文件传输、QQ空间和QQ邮箱在内的多个功能无法使用。 这事儿都听说了吧&#xff1f; 据报道&#xff0c;这次的事故是因为电信机房冷却系统故障导致。 …

Linux安装Tomcat搭建Jenkins

前提条件 由于Tomcat服务器主要用于部署java web项目。所以先安装java jdk。安装过程大家应该很轻车熟练了。 一、安装Tomcat 创建/usr/tomcat文件夹 mkdir -p /usr/tomcat下载tomcat安装包 wget https://archove.apache.org/dist/tomcat/tomcat-8/v8.0.23/bin/apache-tomcat…

umi4 实现msal aad 登录loginRedirect方式并获取令牌

在 Umi 4 中使用 Ant Design Pro Layout 以及 MSAL (Microsoft Authentication Library) 实现登录并获取令牌进入到首页&#xff0c;你需要按照以下步骤进行操作&#xff1a; 安装所需依赖&#xff1a; 使用 npm 或 yarn 安装所需的包&#xff1a; npm install azure/msal-bro…

从零开始Vue3+Element Plus后台管理系统(十)——自定义水印指令与全局注册

在实际项目开发中&#xff0c;自定义指令用得还是比较多的&#xff0c;比如&#xff1a;复制粘贴、输入框防抖、输入框禁止特殊字符、权限校验、背景水印、拖拽等等… 指令确实是个优雅的存在。 Vue3中定义一个普通的自定义指令的详细说明参见官网&#xff1a;https://cn.vue…

sentinel配置持久化到apollo

背景 sentinel-dashborad的配置默认是存储到内存中的&#xff0c;生产环境肯定不能这样使用&#xff0c;官网支持zookeeper、nacos、apollo的配置&#xff0c;本文就来介绍apollo的持久化 apollo sentinel-dashboard 整合 apollo 进行规则的持久化配置&#xff0c;主要方式是…

Kettle获取接口数据到表

kettle从接口服务获取数据 主要用到kettle输入菜单下的控件&#xff1a;生成记录、JSON input 查询菜单下的控件&#xff1a;HTTP client 输出菜单下的控件&#xff1a;表输出、插入/更新 生成记录&#xff1a;设置一个变量&#xff0c;用这个变量来保存要去访问接口的URL地址…

数据结构学习之队列

前言&#xff1a;在我们学习了栈之后&#xff0c;明白了它的结构的特殊性即LAST IN FIRST OUT(后进先出)&#xff0c;与之相对应的也有一个特殊的结构队列&#xff08;queue&#xff09;--FIRST IN FIRST OUT(先进先出)&#xff0c;他们都是面对特殊情况下的数据的结构&#xf…

支持导入 Postman ,用这个插件就可以了

首先安装 导入 Postcat 插件&#xff0c;之后就可以愉快的导入 Postman 格式的文件了。 右上角——选择导入——选择Postman 格式——拖入文件 导入即可&#xff01;再也不用担心 Postcat 格式的 api 文件能把自己难住了&#xff01; 如果你日常会用到 api 管理工具的话&#x…

5G和物联网将如何重塑汽车行业?物联网将给汽车行业带来哪些变革?

“ 物联网(Internet of Things)的诞生给无数行业带来了变革&#xff0c;其中就包括汽车行业。物联网对于汽车发展的重要性是毋庸置疑的。从网联汽车到智能交通系统&#xff0c;物联网正在为汽车行业开辟下一个汽车时代。汽联网(Internet of Vehicles)正在成型。” 我们今天看到…

k8s部署mysql并使用nfs持久化数据

k8s部署mysql并使用nfs持久化数据 一、配置nfs服务器1.1 修改配置文件1.2. 载入配置1.3. 检查服务配置 二、创建K8S资源文件2.1 mysql-deployment.yml2.2 mysql-svc.yml 一、配置nfs服务器 参考文章: pod使用示例https://cloud.tencent.com/developer/article/1914388nfs配置…

管好【SD-WEBUI】中大量的模型:名称+预览图+备注+分组(Part.2)

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;模型预览图&#xff08;1.1&#xff09;预览图姿态&#xff08;证件照&#xff09;&#xff08;1.2&#xff09;预览图姿态&#xff08;半身动作&#xff09; &#xff08;二&#xff09;LoRA模型名称&#…

机器人关节电机PWM

脉冲宽度调制(Pulse width modulation,PWM)技术。一种模拟控制方式 机器人关节电机的控制通常使用PWM(脉冲宽度调制)技术。PWM是一种用于控制电子设备的技术,通过控制高电平和低电平之间的时间比例,实现对电子设备的控制。在机器人关节电机中,PWM信号可以控制电机的…