oracle 行转列和列转行的几种方式

这篇具有很好参考价值的文章主要介绍了oracle 行转列和列转行的几种方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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、查询数据

oracle 行转列和列转行的几种方式

 3、行转列

方式1:使用 case when  then方式

case 条件

when 值1 then 返回值1

when 值2 then 返回值2

..........

else 默认值

end

-- 使用case when 方式
SELECT
	id,
	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 
FROM
	REST 
GROUP BY
	id 

case when 另一种方式:

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

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

        else 默认值

        end

	SELECT
	id,
	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 
FROM
	REST 
GROUP BY
	id 

结果为:

oracle 行转列和列转行的几种方式

方式2: 使用 decode函数

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

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

--	使用decode函数
SELECT
	id,
	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 
FROM
	REST 
GROUP BY
	id 

结果和方式1一样

oracle 行转列和列转行的几种方式

方式3:使用pivot函数

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

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

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

oracle 行转列和列转行的几种方式

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

SELECT
	NVl(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
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 
		) 
	);

结果和方式1一样:

oracle 行转列和列转行的几种方式

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

结果为:

oracle 行转列和列转行的几种方式  

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

查询出的数据

oracle 行转列和列转行的几种方式

列转行sql

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

 结果为:

oracle 行转列和列转行的几种方式文章来源地址https://www.toymoban.com/news/detail-451122.html

到了这里,关于oracle 行转列和列转行的几种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • SQL行转列、列转行(SQL Server版)

    在SQL Server中使用SQL实现行转列、列转行,可以使用多种方法,在SQL 2005以前可以使用case when then...语句,但这种方法的问题在于列举的列名要写死,如果列名很多,case when 语句会很长,并不优雅。所以需要SQL Server提供新的语句能够实现。在2005版本就推出了pivot/unpivot,

    2024年02月08日
    浏览(59)
  • 搞定mysql的 行转列(7种方法) 和 列转行

    一、行转列 1、使用case…when…then  2、使用SUM(IF()) 生成列 3、使用SUM(IF()) 生成列 + WITH ROLLUP 生成汇总行 4、使用SUM(IF()) 生成列,直接生成汇总结果,不再利用子查询 5、使用SUM(IF()) 生成列 + UNION 生成汇总行,并利用 IFNULL将汇总行标题显示为 Total 6、动态查询列值不确定的情况

    2024年03月12日
    浏览(53)
  • MySQL中的面试题——行转列(列转行)手把手详解思想

    目录 1、什么是行转列,列转行 ? 1.1、概念: 1.2、行转列和列转行的思想 1.2.1、行转列的思想? 1.2.2、列转行的思想? 3、实操讲解 3.1、实现行转列  3.2、总结:行转列实现的两种方法    3.3、实现列转行  3.4、总结 :列转行 4、动手练习         在MySQL中,行转列(

    2024年02月03日
    浏览(61)
  • Oracle子查询改写的几种方式

    子查询是嵌套在另一个语句(如SELECT,INSERT,UPDATE或DELETE)中的SELECT语句。 通常,可以在任何使用表达式的地方使用子查询。 比如从以下的病人信息中查询最近一个月住院年龄最大的病人信息 从以上的信息中我们知道病人出生日期BIRTHDATE ,限制取数的时间范围算出年龄 首先我

    2024年02月09日
    浏览(46)
  • greenplum行转列

    项目中需要将150w的数据转为1500列的大宽表数据。 最开始尝试了网上提供的两种方法: 实际业务中10行*1500列数据查询并插入需要25秒左右(测试服务器性能比较差) case when的问题是每个case when的语句都会把分组后的数据判断一下,时间复杂度为O²(O为行转列后的列数),非

    2024年02月03日
    浏览(40)
  • sql 行转列

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 实现行转列的两种方式,case when 与piovt 函数的使用例子与比对 示例:如需要将左边的表格转换成右边的表格 首先,根据资产属性先将数据分成四列 代码如下:` 结果如下: I 这样看起来比较乱,需要根

    2024年02月09日
    浏览(40)
  • mysql 行转列

    以下是其中比较常见的几种方法: 使用GROUP_CONCAT函数 可以使用GROUP_CONCAT函数将多行数据合并为一行,并以逗号或其他分隔符进行分隔。通过SELECT语句和GROUP BY子句,可以将数据行转换为列。具体语法如下: 其中,id表示非透视列,status表示需要转换为列的字段,value表示需要

    2024年02月16日
    浏览(53)
  • SqlServer行转列方法

    数据库建表 1 使用聚合函数巧妙解决,可以用max、sum等 2 使用pivot函数 3.行转列,多列,参考

    2024年02月15日
    浏览(69)
  • Mysql行转列函数

    group_concat() 例: select oid from Test;  select group_concat( oid ) from Test;

    2024年02月14日
    浏览(41)
  • PostgreSQL如何行转列

    PostgreSQL如何行转列 方法一: group by + sum + case when 方法二: 用postgresql的crosstab交叉函数 方法三: group by + string_agg + split_part(分组,行转列,字符切割) group by + string_agg

    2024年02月11日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包