【PLSQL 练习题4】行列转换种4种方法{重要}

通常数据库更偏向于纵向存储,而非横向。
Q1: 为什么会这样?
一般而言,数据都以纵深方向存放,然后在展示的时候,用横向铺开

行列转换方法
1. CASE WHEN/ DECODE
2. PIVOT 函数
3. 分析函数 Over(PARTITION)
4. 表关联

【PLSQL 练习题4】行列转换种4种方法{重要}_第1张图片

我们最终想要展示的结果如下:

【PLSQL 练习题4】行列转换种4种方法{重要}_第2张图片

方法一:CASE WHEN/DECODE 分析

1.对比原表,新增了4列 —— 全部添加到Select语句里,分别命名为Q1,Q2
2.只剩下两行,并进行了统计 —— 运用Group By 分组

Attention:
1.单凡用了Group by 函数,在Select语句要么就是按照分组的那个字段,要么出现相应的聚合函数_,不得随意添加其他字段,否则报错。_

 SELECT Y, 
      MAX(CASE WHEN Q = 1 THEN AMT ELSE NULL END) AS Q1,
      MAX(CASE WHEN Q = 2 THEN AMT ELSE NULL END) AS Q2,
      MAX(CASE WHEN Q = 3 THEN AMT ELSE NULL END) AS Q3,
      MAX(CASE WHEN Q = 4 THEN AMT ELSE NULL END) AS Q4
      FROM T_Y_Q_AMT GROUP BY Y
DECODE 函数语法:
DECODE ( value,if 条件1,then 值1,if 条件2,then 值2,...,else 其他值)
SELECT Y, 
         SUM(DECODE(Q,1,AMT,NULL)) AS Q1,
         SUM(DECODE(Q,2,AMT,NULL)) AS Q2,
         SUM(DECODE(Q,3,AMT,NULL)) AS Q3,
         SUM(DECODE(Q,4,AMT,NULL)) AS Q4
         
         FROM T_Y_Q_AMT GROUP BY Y
方法二: Pivot函数 分析

1. 观察结果表,就像Excel表里的Pivot Table
2. 行字段是Y,列字段是Q,AMT 就是值

【PLSQL 练习题4】行列转换种4种方法{重要}_第3张图片

Pivot 函数语法
关键函数pivot,其用法如下 pivot(聚合函数 for 列名 in(类型))
如果换作Excel 的视角则如下:

Excel 角度
Pivot(聚合函数-值字段 for 行 in(列字段转化))
行字段转换 - 原来列名(都是统一的)as 新列的列名

  SELECT * FROM T_Y_Q_AMT 
  PIVOT(MAX(AMT) FOR Q IN(1 AS Q1,2 AS Q2,3 AS Q3,4 AS Q4))

反向列转行UnPivot函数

方法三:位移函数LAG,LEAD,向上偏移向下偏移
LAG(字段,向下偏移数字)OVER(PARTITION BY 按字段分组 ORDER BY 按字段排序)
LEAD(字段,向上偏移数字)OVER(PARTITION BY 按字段分组 ORDER BY 按字段排序)

第一步:分别将AMT向上偏移一位

SELECT T.*
       ,LEAD(T.AMT, 1)OVER(PARTITION BY T.Y ORDER BY T.Q) LD1
       ,LEAD(T.AMT, 2)OVER(PARTITION BY T.Y ORDER BY T.Q) LD2
       ,LEAD(T.AMT, 3)OVER(PARTITION BY T.Y ORDER BY T.Q) LD3
       FROM T_Y_Q_AMT T

【PLSQL 练习题4】行列转换种4种方法{重要}_第4张图片

第二步:套入子查询,筛选Q=1 即可。

SELECT A.Y,A.AMT AS Q1,A.LD1 AS Q2,A.LD2 AS Q3,A.LD3 AS Q4 FROM 
(
SELECT T.*
       ,LEAD(T.AMT, 1)OVER(PARTITION BY T.Y ORDER BY T.Q) LD1
       ,LEAD(T.AMT, 2)OVER(PARTITION BY T.Y ORDER BY T.Q) LD2
       ,LEAD(T.AMT, 3)OVER(PARTITION BY T.Y ORDER BY T.Q) LD3
       FROM T_Y_Q_AMT T
)  A 
WHERE A.Q=1
**方法四:表关联
**分析思路: 这张表横向观察由4张表合并而成。
2015,2016的Q1表和2015,2016的Q2表... ... 它们的关联字段就是年份
 SELECT * FROM T_Y_Q_AMT T
       ,(SELECT Y,AMT FROM T_Y_Q_AMT WHERE Q =2) Q2
       ,(SELECT Y,AMT FROM T_Y_Q_AMT WHERE Q =3) Q3
       ,(SELECT Y,AMT FROM T_Y_Q_AMT WHERE Q =4) Q4
       WHERE T.Y = Q2.Y
       AND T.Y = Q3.Y
       AND T.Y = Q4.Y
       AND T.Q = 1 

【PLSQL 练习题4】行列转换种4种方法{重要}_第5张图片

刚好在第一个AMT的值就等于第一季度的值,因此直接别命名为Q1即可。

 SELECT T.Y,T.AMT AS Q1,Q2.AMT AS Q2,Q3.AMT AS Q3,Q4.AMT AS Q4 FROM T_Y_Q_AMT T
       ,(SELECT Y,AMT FROM T_Y_Q_AMT WHERE Q =2) Q2
       ,(SELECT Y,AMT FROM T_Y_Q_AMT WHERE Q =3) Q3
       ,(SELECT Y,AMT FROM T_Y_Q_AMT WHERE Q =4) Q4
       WHERE T.Y = Q2.Y
       AND T.Y = Q3.Y
       AND T.Y = Q4.Y
       AND T.Q = 1 

你可能感兴趣的:(oralce,plsql)