oracle 常用写法--列转行,oracle行列转换 - osc_i5nfw8fz的个人空间 - OSCHINA - 中文开源技术交流社区...

行列转换的几种写法

列转行:

1.最简单的写法,使用关键字PIVOT

语法:SELECT * FROM TABLENAME PIVOT(MAX(LIST1) FOR LIST2 IN (VALUES1,VALUES2,VALUES3,VALUES4))

例子:

b20c393f812e3933757d2f6413a00da1.png

实现行列转换效果:

db570bef7a20ef0065f84fc85b29ee65.png

代码:SELECT * FROM S PIVOT(MAX(AMT) FOR Q IN (1,2,3,4))

2. 使用分析函数load/lag进行行列转换

代码:

SELECT S.Y, S.AMT Q1, S.LD1 Q2, S.LD2 Q3, S.LD3 Q4

FROM (SELECT S.*,

LEAD(S.AMT, 1) OVER(PARTITION BY S.Y ORDER BY S.Q) LD1,

LEAD(S.AMT, 2) OVER(PARTITION BY S.Y ORDER BY S.Q) LD2,

LEAD(S.AMT, 3) OVER(PARTITION BY S.Y ORDER BY S.Q) LD3

FROM S) S

WHERE S.Q = 1

7bd445af9874ef69b4440396df2f67bf.png

3. 使用decode函数进行行列转换

代码:

SELECT S.Y,

SUM(DECODE(S.Q, 1, AMT, NULL)) Q1,

SUM(DECODE(S.Q, 2, AMT, NULL)) Q2,

SUM(DECODE(S.Q, 3, AMT, NULL)) Q3,

SUM(DECODE(S.Q, 4, AMT, NULL)) Q4

FROM S

GROUP BY S.Y

3aa16f02f63df373a62ea8d0f4dbcbe7.png

4.部分关联

代码:

SELECT S.Y, S.AMT Q1, A.AMT Q2, B.AMT Q3, C.AMT Q4

FROM S,

(SELECT * FROM S WHERE S.Q = 2) A,

(SELECT * FROM S WHERE S.Q = 3) B,

(SELECT * FROM S WHERE S.Q = 4) C

WHERE S.Y = A.Y

AND S.Y = B.Y

AND S.Y = C.Y

AND S.Q=1

843b163e8c951dcb403f0866bc6dcf3a.png

行转列:UNPIVOT

代码:WITH A AS (SELECT * FROM S PIVOT(MAX(AMT) FOR Q IN (1 Q1,2 Q2,3 Q3,4 Q4))) SELECT * FROM A UNPIVOT(AMT FOR Q IN (Q1,Q2,Q3,Q4))

df733df2401cc7cfb42a476ae3701861.png

原文出处:https://www.cnblogs.com/wenxing9415/p/10973495.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值