sql 行转列

本文介绍了在Oracle SQL中如何使用CASE WHEN和PIVOT函数进行行转列的操作。通过案例展示,对比了两者在处理行转列时的差异,包括代码复杂性、灵活性和适用场景。CASE WHEN适用于复杂场景,编写较繁琐;而PIVOT编写简单,但限制较多,适用于单一列值的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


oracle sql 实现行转列

实现行转列的两种方式,case when 与piovt 函数的使用例子与比对

一、CASE WHEN 实现行转列

示例:如需要将左边的表格转换成右边的表格
![在这里插入图片描述](https://img-blog.csdnimg.cn/8985d2c9ee354baaa6dc9ab6025eb244.png!

首先,根据资产属性先将数据分成四列
代码如下:`

SELECT PD_NAME AS 产品名称,
	   CASE WHEN ASSET_TYPE='交易性金融资产' THEN BALANCE END AS 交易性金融资产,
	   CASE WHEN ASSET_TYPE='银行存款' THEN BALANCE END AS 银行存款,
	   CASE WHEN ASSET_TYPE='贷款' THEN BALANCE END  AS 贷款
FROM T_PRODUCT_SUBJECT_AMT;

结果如下:
I在这里插入图片描述
这样看起来比较乱,需要根据产品名称进行汇总,则需要用到聚合函数,如下;

SELECT PD_NAME AS 产品名称,
	   SUM(CASE WHEN ASSET_TYPE='交易性金融资产' THEN BALANCE END) AS 交易性金融资产,
	   SUM(CASE WHEN ASSET_TYPE='银行存款' THEN BALANCE END) AS 银行存款,
	   SUM(CASE WHEN ASSET_TYPE='贷款' THEN BALANCE END) AS 贷款
FROM T_PRODUCT_SUBJECT_AMT
GROUP BY PD_NAME
;

在这里插入图片描述
这样就完整的实现行转列的效果了。

二、PIVOT 实现行转列

代码如下(示例):

SELECT * FROM
	(SELECT PD_NAME,/*没有在pivot里的字段会被作为分组条件*/
			BALANCE,
			ASSET_TYPE 
	  FROM T_PRODUCT_SUBJECT_AMT
	  )
	PIVOT (SUM(BALANCE) AS 余额 /*pivot 函数中必须要有聚合函数出现*/
			FOR ASSET_TYPE IN (
								'交易性金融资产' ,
								'银行存款',
								'贷款'
								) /*分组条件*/
	)

结果如下:
在这里插入图片描述


三、比对

1.如果行转列的行数分类情况较多,使用pivot可以方便书写和改动;case when 写的代码就比较麻烦了些;
2.pivot一次只能实现某一列的值作为条件行转列操作,如果需要多个列的值作为条件同时进行转换时,只能使用 case when ;
3.pivot只能按照同一个规则分类各类数据,各类数据之间不能重复交叉,比如使用pivot不能实现对产品A、B的一个总资产的汇总,case when 可以实现;
4.总的来说, case when 的编写比较麻烦,但是使用场景比较灵活,pivot编写比较简单、简短,但是限制比较多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值