行转列的多种方法探究

本文所使用的创表语句如下:

create table umo (
    Y number(4),
    Q number(4),
    AMT number(4)
)
insert into umo values(2015,1,100);
insert into umo values(2015,2,110);
insert into umo values(2015,3,130);
insert into umo values(2015,4,100);
insert into umo values(2016,1,100);
insert into umo values(2016,2,150);
insert into umo values(2016,3,100);
insert into umo values(2016,4,300);


方法一:使用lead迁移函数

 SELECT S.Y, S.AMT Q1, S.LD1 Q2, S.LD2 Q3, S.LD3 Q4
  FROM (SELECT umo.*,
               LEAD(umo.AMT, 1) OVER(PARTITION BY umo.Y ORDER BY umo.Q) LD1,
               LEAD(umo.AMT, 2) OVER(PARTITION BY umo.Y ORDER BY umo.Q) LD2,
               LEAD(umo.AMT, 3) OVER(PARTITION BY umo.Y ORDER BY umo.Q) LD3
          FROM umo) S
 WHERE S.Q = 1

迁移函数将Q=2,Q=3,Q=4的AMT值都移向同一行,之后截取 Q=1即可;

方法二 :使用多表关联

SELECT umo.Y, umo.AMT Q1, A.AMT Q2, B.AMT Q3, C.AMT Q4
   FROM umo,
        (SELECT * FROM umo WHERE umo.Q = 2) A,
        (SELECT * FROM umo WHERE umo.Q = 3) B,
        (SELECT * FROM umo WHERE umo.Q = 4) C
  WHERE umo.Y = A.Y
    AND umo.Y = B.Y
    AND umo.Y = C.Y
    AND umo.Q=1

此方法将Q=2,Q=3,Q=4分别成表筛选出来,进行表关联,最后同样是选择Q=1即可;

方法三:使用decode判断

 SELECT umo.Y,
       SUM(DECODE(umo.Q, 1, AMT, NULL)) Q1,
       SUM(DECODE(umo.Q, 2, AMT, NULL)) Q2,
       SUM(DECODE(umo.Q, 3, AMT, NULL)) Q3,
       SUM(DECODE(umo.Q, 4, AMT, NULL)) Q4
  FROM umo
 GROUP BY umo.Y

需注意,null数据库解释为:不知道,不参与聚合函数的运算

方法四 case when 判断

select umo.Y,
    max(case when umo.Q=1 then AMT else null end) Q1,
    max(case when umo.Q=2 then AMT else null end) Q2,
    max(case when umo.Q=3 then AMT else null end) Q3,
    max(case when umo.Q=4 then AMT else null end) Q4
    from umo
    GROUP BY umo.Y

基本思路和使用decode判断相同,case when 的语句更具有普适性,不仅仅适用于ORACLE

方法五 pivot函数

select * from umo pivot(SUM(AMT) FOR Q IN (1 AS Q1 , 2 AS Q2, 3 AS Q3 , 4 AS Q4 )) ORDER BY Y

使用pivot函数最为简洁,注意一定要使用聚合函数哦!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值