oracle 行转列和列转行的几种方式
创始人
2025-05-28 20:48:31

1、准备数据:REST表

-- 创建表REST
CREATE TABLE REST ("ID" NUMBER,"AMOUNT" NUMBER(19,0),"MONTH" VARCHAR2(255 BYTE)
);--执行添加数据语句
INSERT INTO "CERPAWCSADM"."REST" VALUES ('1', '100', 'Jan');
INSERT INTO "CERPAWCSADM"."REST" VALUES ('1', '100', 'Feb');
INSERT INTO "CERPAWCSADM"."REST" VALUES ('1', '66', 'Mar');
INSERT INTO "CERPAWCSADM"."REST" VALUES ('1', '77', 'Jun');
INSERT INTO "CERPAWCSADM"."REST" VALUES ('1', '88', 'Dec');
INSERT INTO "CERPAWCSADM"."REST" VALUES ('1', '12', 'Aug');
INSERT INTO "CERPAWCSADM"."REST" VALUES ('2', '22', 'Feb');
INSERT INTO "CERPAWCSADM"."REST" VALUES ('2', '33', 'Apr');
INSERT INTO "CERPAWCSADM"."REST" VALUES ('2', '232', 'Jul');
INSERT INTO "CERPAWCSADM"."REST" VALUES ('2', '43', 'Sep');
INSERT INTO "CERPAWCSADM"."REST" VALUES ('2', '544', 'Oct');
INSERT INTO "CERPAWCSADM"."REST" VALUES ('2', '65', 'Nov');

2、查询数据

 3、行转列

方式1:使用 case when  then方式

case 条件

when 值1 then 返回值1

when 值2 then 返回值2

..........

else 默认值

end

-- 使用case when 方式
SELECTid,sum( CASE month WHEN 'Jan' THEN amount ELSE 0 END ) AS Jan_amount,sum( CASE month WHEN 'Feb' THEN amount ELSE 0 END ) AS Feb_amount,sum( CASE month WHEN 'Mar' THEN amount ELSE 0 END ) AS Mar_amount,sum( CASE month WHEN 'Apr' THEN amount ELSE 0 END ) AS Apr_amount,sum( CASE month WHEN 'May' THEN amount ELSE 0 END ) AS May_amount,sum( CASE month WHEN 'Jun' THEN amount ELSE 0 END ) AS Jun_amount,sum( CASE month WHEN 'Jul' THEN amount ELSE 0 END ) AS Jul_amount,sum( CASE month WHEN 'Aug' THEN amount ELSE 0 END ) AS Aug_amount,sum( CASE month WHEN 'Sep' THEN amount ELSE 0 END ) AS Sep_amount,sum( CASE month WHEN 'Oct' THEN amount ELSE 0 END ) AS Oct_amount,sum( CASE month WHEN 'Nov' THEN amount ELSE 0 END ) AS Nov_amount,sum( CASE month WHEN 'Dec' THEN amount ELSE 0 END ) AS Dec_amount 
FROMREST 
GROUP BYid 

case when 另一种方式:

        case when 条件 = 值1 then 返回值1 

        case when 条件 = 值1 then 返回值1 

        else 默认值

        end

	SELECTid,sum( CASE  WHEN month ='Jan' THEN amount ELSE 0 END ) AS Jan_amount,sum( CASE  WHEN month = 'Feb' THEN amount ELSE 0 END ) AS Feb_amount,sum( CASE  WHEN month = 'Mar' THEN amount ELSE 0 END ) AS Mar_amount,sum( CASE  WHEN month = 'Apr' THEN amount ELSE 0 END ) AS Apr_amount,sum( CASE  WHEN month = 'May' THEN amount ELSE 0 END ) AS May_amount,sum( CASE  WHEN month = 'Jun' THEN amount ELSE 0 END ) AS Jun_amount,sum( CASE  WHEN month = 'Jul' THEN amount ELSE 0 END ) AS Jul_amount,sum( CASE  WHEN month = 'Aug' THEN amount ELSE 0 END ) AS Aug_amount,sum( CASE  WHEN month = 'Sep' THEN amount ELSE 0 END ) AS Sep_amount,sum( CASE  WHEN month = 'Oct' THEN amount ELSE 0 END ) AS Oct_amount,sum( CASE  WHEN month = 'Nov' THEN amount ELSE 0 END ) AS Nov_amount,sum( CASE  WHEN month = 'Dec' THEN amount ELSE 0 END ) AS Dec_amount 
FROMREST 
GROUP BYid 

结果为:

方式2: 使用 decode函数

decode函数: DECODE(条件, 值1, 返回值1, 值2,返回值2, 值3,返回值3, . . . else 缺省值)

含义:if 条件 = 值1 then 返回值1 elsif 条件 = 值2 then 返回值2  else (缺省值) endif

--	使用decode函数
SELECTid,sum( decode( month, 'Jan', amount, 0 ) ) Jan_amount,sum( decode( month, 'Feb', amount, 0 ) ) Feb_amount,sum( decode( month, 'Mar', amount, 0 ) ) Mar_amount,sum( decode( month, 'Apr', amount, 0 ) ) Apr_amount,sum( decode( month, 'May', amount, 0 ) ) May_amount,sum( decode( month, 'Jun', amount, 0 ) ) Jun_amount,sum( decode( month, 'Jul', amount, 0 ) ) Jul_amount,sum( decode( month, 'Aug', amount, 0 ) ) Aug_amount,sum( decode( month, 'Sep', amount, 0 ) ) Sep_amount,sum( decode( month, 'Oct', amount, 0 ) ) Oct_amount,sum( decode( month, 'Nov', amount, 0 ) ) Nov_amount,sum( decode( month, 'Dec', amount, 0 ) ) Dec_amount 
FROMREST 
GROUP BYid 

结果和方式1一样

方式3:使用pivot函数

pivot
(
<聚合函数>(要聚合的列)
for <要转换的列> in (要转换的列值 as 要转换成的列名)

SELECT* 
FROMREST pivot (SUM(amount) FOR month IN ('Jan' AS Jan_amount,'Feb' AS Feb_amount,'Mar' AS Mar_amount,'Apr' AS Apr_amount,'May' AS May_amount,'Jun' AS Jun_amount,'Jul' AS Jul_amount,'Aug' AS Aug_amount,'Sep' AS Sep_amount,'Oct' AS Oct_amount,'Nov' AS Nov_amount,'Dec' AS Dec_amount ) );

结果为:这个结果会发现,如果数据为空没有赋值为0

 下面这个方法解决null 转为0 问题

SELECTNVl(Jan_amount,0) Jan_amount,NVl(Feb_amount,0) Feb_amount,NVl(Mar_amount,0) Mar_amount,NVl(Apr_amount,0) Apr_amount,NVl(May_amount,0) May_amount,NVl(Jun_amount,0) Jun_amount,NVl(Jul_amount,0) Jul_amount,NVl(Aug_amount,0) Aug_amount,NVl(Sep_amount,0) Sep_amount,NVl(Oct_amount,0) Oct_amount,NVl(Nov_amount,0) Nov_amount,NVl(Dec_amount,0) Dec_amount
FROMREST pivot (SUM(amount) FOR month IN ('Jan' AS Jan_amount,'Feb' AS Feb_amount,'Mar' AS Mar_amount,'Apr' AS Apr_amount,'May' AS May_amount,'Jun' AS Jun_amount,'Jul' AS Jul_amount,'Aug' AS Aug_amount,'Sep' AS Sep_amount,'Oct' AS Oct_amount,'Nov' AS Nov_amount,'Dec' AS Dec_amount ) );

结果和方式1一样:

4、列转行

在上述pivot 方法的原sql语句上再加上unpivot函数,将列再转为行,在unpivot函数中,amount:表示由列转换为行后的数据

month:表示由列转换为行后的列名

select * from REST
pivot (sum(amount) for month in ('Jan' AS Jan_amount,'Feb' AS Feb_amount,'Mar' AS Mar_amount,'Apr' AS Apr_amount,'May' AS May_amount,'Jun' AS Jun_amount,'Jul' AS Jul_amount,'Aug' AS Aug_amount,'Sep' AS Sep_amount,'Oct' AS Oct_amount,'Nov' AS Nov_amount,'Dec' AS Dec_amount 
))
unpivot ( amount for month in(Jan_amount,Feb_amount,Mar_amount,Apr_amount,May_amount,Jun_amount,Jul_amount,Aug_amount,Sep_amount,Oct_amount,Nov_amount,Dec_amount));

结果为:

  

5、直接使用unpivot函数 --列转行

准备数据:TEST表

CREATE TABLE TEST ("ID" NUMBER(12,0) NOT NULL,"JAN" VARCHAR2(255 BYTE),"FEB" VARCHAR2(255 BYTE),"MAR" VARCHAR2(255 BYTE),"APR" VARCHAR2(255 BYTE),"MAY" VARCHAR2(255 BYTE),"JUN" VARCHAR2(255 BYTE),"JUL" VARCHAR2(255 BYTE),"AUG" VARCHAR2(255 BYTE),"SEP" VARCHAR2(255 BYTE),"OCT" VARCHAR2(255 BYTE),"NOV" VARCHAR2(255 BYTE),"DEC" VARCHAR2(255 BYTE)
);
-- 插入数据
INSERT INTO "CERPAWCSADM"."TEST" VALUES ('1', '33', '2', '3', '4', '5', '6', '7', '8', '9', '99', '8', '6');
INSERT INTO "CERPAWCSADM"."TEST" VALUES ('2', '22', '3', '4', '6', '5', '7', '0', '7', '22', '21', '343', '76');
INSERT INTO "CERPAWCSADM"."TEST" VALUES ('3', '88', '3', '4', '5', '7', '9', '7', '2', '2', '231', '56', '78');

查询出的数据

列转行sql

SELECT* 
FROM TESTunpivot ( amount for month in(JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC));

 结果为:

相关内容

热门资讯

宗馥莉,正式接手! 宗馥莉,正... 王思文/中国基金报近日,浙江娃哈哈实业股份有限公司(以下简称娃哈哈实业公司)发生工商变更,宗庆后卸任...
【博学谷学习记录】超强总结,用... 什么情况使用MQ??? 1.确实是用了有效果。即解耦、提速...
Kubernetes应用包管理... 目录一、Helm概述 1.1 为什么需要Helm? 1.2 Helm 介绍 1.3 H...
Java的参数传递 最近一直疑惑一个问题,Java函数传递的形参会影响实参的值吗,听到网上很...
CLH同步队列 什么是同步队列(CLH) 同步队列 一个FIFO双向队列,...
中央决定:中国一重董事长调整 ... 澎湃新闻记者 岳怀让5月30日,中国一重集团有限公司召开中层以上管理人员大会。中共中央组织部有关负责...
函数中的对象 系列文章目录 前端系列文章——传送门 JavaScript系列文章——传送门 文章目录系列文章目录...
通胀保持温和!美国4月核心PC... 今日晚间,美联储最关注的通胀指标——美国4月PCE数据发布。 美国消费者在经历了2023年初以来最强...
北京发布2025年第五轮拟供商... 今日,北京市规划和自然资源委员会网站发布了2025年度第五轮拟供应商品住宅用地清单,共涉及8宗地,土...
时代出版股票三个交易日涨幅偏离... 雷达财经 文|冯秀语 编|李亦辉 5月30日,时代出版(证券代码:600551)发布股票交易异常波动...
4月新备案私募基金1606只 中国基金业协会最新发布的数据显示,2025年4月,新备案私募基金数量1606只,新备案规模643.7...
宗馥莉接任娃哈哈法定代表人、董... 近日,浙江娃哈哈实业股份有限公司(以下简称娃哈哈实业公司)发生工商变更,宗庆后卸任法定代表人、董事长...
Linux Debian11安... 一、VirtualBox虚拟机简介 VirtualBox 是一款开源虚拟机软件。VirtualBox...
节点问道CEO沙龙:AI时代,... 技术是商业进步的主要驱动力。每次技术迭代都有巨头陨落,明星企业崛起。在AI技术蓬勃发展,变革越发迫切...
新战场!券商押注T0算法服务,... 21世纪经济报道记者李域 深圳报道量化交易加速走向个人投资者。5月26日,中泰证券官宣,齐富通T0算...
【JavaFx基础】在画布中画... 一、需求描述 JavaFx项目中,实现用画布控件在画布中画线框 二、代码参考 pack...
Scala环境安装【傻瓜式教程... 文章目录安装scala环境依赖Java环境安装下载sacla的sdk包安装Scala2.12检查安装...
(一)大数据实战——hadoo... 前言 本节内容是大数据开篇的内容,主要介绍一下大数据的相关概念,以及ha...
石破茂公开批评美国 据美联社报道,当地时间5月29日,在东京举行的第30届“亚洲的未来”国际论坛上,日本首相石破茂发表演...
Go语言快速的一键生成一个gR... 目录  前言 介绍  使用命令行工具 micro 生成 gRPC 服务 安装: 创建项...
面试官:说一下MySQL中的锁... 5. 1MySQL有哪些锁? 为保证数据的一致性,需要对并发操作进行控制...
【跟着chatgpt学go】G... Goroutine Goroutine 是 Go 语言中的一种并发机制,它是一种轻量级...
ArcGIS:如何利用模型构建... 01 实验数据pop.shp(人口统计数据,其中字段POP100表示该地...
TCP三次握手/四次挥手 TCP三次握手 任何基于TCP的应用,在发送数据之前,都需要由TCP进行...
21《Protein Acti... 《Protein Actions Principles and Modeling》-《蛋白质作用原理...
docker版jxTMS使用指... 本文讲解docker版jxTMS的helloWorld!是如何定制的,整个系列的文章请...
文件类型处理器中的程序路径必须... 很多人可能还没有意识到这一点,但是在 Windows XP SP2 中,...
日本学历贬值30年:博士批量失... 在日本,过去的 30 年里,学历贬值现象愈发严重。如今,博士批量失业已成为常态,这些曾在学术领域攀登...
尊界S800是谁在买?华为系最... 本文来源:时代周报 作者:武凯尊界S800向超豪华汽车市场发起冲击。 图片来源:时代周报记者摄5月...
使用fetch()异步请求AP... 任务8 https://segmentfault.com/a/1190000038998601 ht...