提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
oracle sql 实现行转列
实现行转列的两种方式,case when 与piovt 函数的使用例子与比对
一、CASE WHEN 实现行转列
示例:如需要将左边的表格转换成右边的表格
首先,根据资产属性先将数据分成四列
代码如下:`
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 (
'交易性金融资产' ,
'银行存款',
'贷款'
) /*分组条件*/
)
结果如下:
文章来源:https://www.toymoban.com/news/detail-483599.html
三、比对
1.如果行转列的行数分类情况较多,使用pivot可以方便书写和改动;case when 写的代码就比较麻烦了些;
2.pivot一次只能实现某一列的值作为条件行转列操作,如果需要多个列的值作为条件同时进行转换时,只能使用 case when ;
3.pivot只能按照同一个规则分类各类数据,各类数据之间不能重复交叉,比如使用pivot不能实现对产品A、B的一个总资产的汇总,case when 可以实现;
4.总的来说, case when 的编写比较麻烦,但是使用场景比较灵活,pivot编写比较简单、简短,但是限制比较多。文章来源地址https://www.toymoban.com/news/detail-483599.html
到了这里,关于sql 行转列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!