在日常工作中,经常遇到需要将行转列的情况。通过近段时间的学习,分别将几种实现方式总结如下:
一、DECODE 方式
SELECT
CASE WHEN GROUPING(A.SSSWJG_ID)=1 THEN '151170000' ELSE A.SSSWJG_ID END SWJG_DM,
SUM(DECODE(A.SZ_ID,'10101',A.SJJE)) ZZS,
SUM(DECODE(A.SZ_ID,'10102',A.SJJE)) XFS,
SUM(DECODE(A.SZ_ID,'10104',A.SJJE)) QYSDS,
SUM(DECODE(A.SZ_ID,'10106',A.SJJE)) QYSDS,
SUM(DECODE(A.SZ_ID,'10107',A.SJJE)) ZYS
FROM
(
select T.SSSWJG_ID,T.SZ_ID, sum(T.RKSE) SJJE
from tab1_jks t JOIN tab3_sz R ON t.sz_id=r.sz_id
where TO_CHAR(T.RKJZRQ, 'YYYYMM') = '202002'
AND R.SJSZ_ID='10100'
group by T.SSSWJG_ID,T.SZ_ID
)A
GROUP BY ROLLUP(A.SSSWJG_ID);
使用时,需要结合group by进行分组汇总,否则会有数据溢出效应。
二、CASE WHEN 方式
SELECT
CASE WHEN GROUPING(A.SSSWJG_ID)=1 THEN '151170000' ELSE A.SSSWJG_ID END JG_DM,
SUM(CASE WHEN A.SZ_ID='10101' THEN A.RKSE ELSE 0 END) ZZS,
SUM(CASE WHEN A.SZ_ID='10102' THEN A.RKSE ELSE 0 END) XFS,
SUM(CASE WHEN A.SZ_ID='10104' THEN A.RKSE ELSE 0 END) QYSDS,
SUM