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

这篇具有很好参考价值的文章主要介绍了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博客 

oracle列转行函数unpivot,oracle,学习,数据库

oracle列转行函数unpivot,oracle,学习,数据库

 这里有句话说的好,

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

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

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

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

所以这才是真正的概念,因为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

oracle列转行函数unpivot,oracle,学习,数据库

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

oracle列转行函数unpivot,oracle,学习,数据库

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

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

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

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

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

好了直接实战。

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

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

oracle列转行函数unpivot,oracle,学习,数据库

 --这里还是注意 这个函数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'
)
)

oracle列转行函数unpivot,oracle,学习,数据库

这种类似上面的。

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'
        )
)

oracle列转行函数unpivot,oracle,学习,数据库

hive 如何实现呢?

第一步 先求sum总分

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

oracle列转行函数unpivot,oracle,学习,数据库


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别名,你最后的字段名就是'数学'而不是 数学

oracle列转行函数unpivot,oracle,学习,数据库

--里面的分数我自己随便改了点 不影响。
oracle列转行函数unpivot,oracle,学习,数据库

 

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

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

oracle列转行函数unpivot,oracle,学习,数据库

 

如何用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来实现 文章来源地址https://www.toymoban.com/news/detail-689949.html

到了这里,关于oracle 学习之 unpivot/pivot函数及hive实现该功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【hive】列转行—collect_set()/collect_list()/concat_ws()函数的使用场景

    在 Hive 中想实现按某字段分组,对另外字段进行合并,可通过collect_list()或者collect_set()实现。 collect_set()函数与collect_list()函数: 列转行 专用函数,都是将分组中的某列转为一个数组返回。有时为了字段拼接效果,多和concat_ws()函数连用。 collect_set()与collect_list()的区别: co

    2024年02月09日
    浏览(45)
  • HIVE SQL通过Lateral View + explode实现列转行

    原表: a b Andy 碟中谍,谍影重重,007 MOMO 小鞋子,朋友啊你的家在哪里 David ‘’ Lily NULL 实现效果 a b Andy 碟中谍 Andy 谍影重重 Andy 007 MOMO 小鞋子 MOMO 朋友啊你的家在哪里 David ‘’ 实现代码: 注: explode函数:处理map结构的字段,将数组转换成多行,所以此处使用了split函数将

    2024年02月12日
    浏览(37)
  • MySQL实现数据炸裂拆分(类似Hive的explode函数的拆分数组功能)

    背景描述 ​ 在Hive中,\\\"explode\\\"函数用于将数组类型的列拆分为多行,以便对数组中的每个元素进行处理。然而,在MySQL中,并没有直接的类似功能。但是,我们可以使用一些技巧来模拟这个功能,实现在MySQL中拆分数组并进行查询的操作。本文将介绍如何在MySQL中实现类似Hiv

    2024年02月11日
    浏览(42)
  • Hive 和 Oracle 中 Decode 函数的用法差异

    在数仓构建过程中,需要从业务那边进行数据的迁移!数仓大多数公司都是使用 Hive ,而业务那边使用的是 Oracle 数据库居多。最近就有个小伙伴在迁移的时候碰到了问题: 从报错来看,在使用 Decode() 函数的时候,传参有问题! 既然问题来了,我们就来解决一下呗,只有不

    2024年02月10日
    浏览(36)
  • oracle传入两个参数的的replace函数替换成hive方式

    oracle2个参数的replace转换成hive实现 总结:oracle支持传入2个参数,但是hive支持传入3个参数,那么可以将第三个参数写为空字符串 转义符处理 对于concat函数中加“”分隔符需要使用6转义符

    2024年02月13日
    浏览(44)
  • Oracle——行转列与列转行

    把某一个字段的值作为唯一值,然后另外一个字段的 行值转换成它的列值 。 转换过程大致如下所示: 通常情况下,采取 group by 唯一字段 进行分组,然后依据不同的列进行判断输出就能转换。 建表语句和增加测试数据sql如下所示: 执行完毕后,数据库中当前的数据结构如

    2024年02月15日
    浏览(59)
  • Hive的行列转换(行转多列、多列转行、行转单列、单列转行)

    在实际使用Hive的过程中,常常会涉及到行列转换,细分的话,有下面4种类型的行列转换,分别是: 行转多列 多列转行 行转单列 单列转行 下面我们通过样例介绍每种行列转换的实现方法。 样例表 班级成绩表: 姓名(name) 学科(subject) 成绩(score) 行列转换思路分析及实现 行转

    2024年02月15日
    浏览(79)
  • oracle 行转列和列转行的几种方式

    1、准备数据:REST表 2、查询数据  3、行转列 方式1:使用 case when  then方式 case 条件 when 值1 then 返回值1 when 值2 then 返回值2 .......... else 默认值 end case when 另一种方式:         case when 条件 = 值1 then 返回值1          case when 条件 = 值1 then 返回值1          else

    2024年02月05日
    浏览(46)
  • 【Python常用函数】一文让你彻底掌握Python中的pivot_table函数

    任何事情都是由量变到质变的过程,学习Python也不例外。只有把一个语言中的常用函数了如指掌了,才能在处理问题的过程中得心应手,快速地找到最优方案。本文和你一起来探索Python中的pivot_table函数,让你以最短的时间明白这个函数的原理。也可以利用碎片化的时间巩固

    2024年02月12日
    浏览(45)
  • python | 复杂网络:将关系对转换为邻接矩阵(常规方法以及pivot函数)

    复杂网络中常常需要将得到的关系对(图一)转换为邻接矩阵,并存储为csv格式。本文将介绍两方法来进行处理:方法一是构建数据框赋予值。方法二是利用pivot () 函数将一维表转换为二维表。本文所采用的例子为 有向加权网络 。 首先我们的原始数据为关系对(图一):

    2023年04月08日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包