1. 程式人生 > >關於行轉列sql的實現

關於行轉列sql的實現

       最近業務需求經常會遇到行轉列的情況出現。個人也是最近接觸到,總結了兩種常用方法,邏輯也非常好理解。之前在網上也看到了不少其他oracle行轉列的方法,有些是oracle特有的函式,放到其他資料庫未必支援。下來我們看兩個簡單,函式經常會使用到的版本。

1.建立測試表

CREATE TABLE CC  
  (Student VARCHAR,Course VARCHAR2,Score INT  
  );

2.插入測試資料

INSERT into CC   
select '張三',N'語文',78 from dual union all  
select '張三',N'數學',87 from dual union all  
select '張三',N'英語',82 from dual union all  
select '張三',N'物理',90 from dual union all  
select '李四',N'語文',65 from dual union all  
select '李四',N'數學',77 from dual union all  
select '李四',N'英語',65 from dual union all  
select '李四',N'物理',85 from dual ; 

3.預期實現結果

上圖,abcd分別代表測試資料的各個科目。

4.實現方法一:

SELECT  
student,  
MAX(decode(COURSE, '語文', SCORE)) A,  
MAX(DECODE(COURSE, '數學', SCORE)) B,  
MAX(DECODE(COURSE, '英語', SCORE)) C,  
MAX(DECODE(COURSE, '物理', SCORE)) D,  
SUM(SCORE) TOTAL  
FROM  
CC  
GROUP BY  
student

5.實現方法二:

select student,
sum(case COURSE when '語文' then SCORE else 0 end) ,
sum(case COURSE when '數學' then SCORE else 0 end) ,
sum(case COURSE when '英語' then SCORE else 0 end) ,
sum(case COURSE when '物理' then SCORE else 0 end) 
from cc
group by student