SQL 橫豎錶轉換

橫錶轉換豎表:

CREATE table score
(
   username varchar(10) ,
   chinese  int ,
   math     int ,
   physics  int
);

INSERT into score(username , chinese , math , physics) values('Kay',74,83,93);
INSERT into score(username , chinese , math , physics) values('Jim',75,84,94);
INSERT into score(username , chinese , math , physics) values('Lily',86,49,91);

COMMIT;

SELECT * FROM score;

wKioL1TJmWTDimcKAABhyIsoWbg511.jpg

橫錶轉換成豎表關鍵在於如何把一條記錄轉換成多條記錄,三個分數字段對應三條記錄,可以採用一個只有三條記錄中間表和score表做笛卡爾積把一條記錄copy成三條記錄

WITH T AS
( SELECT 'chinese' course FROM dual
  UNION ALL
  SELECT 'math'    course FROM dual
  UNION ALL 
  SELECT 'physics' course FROM dual
) 
SELECT username,course,decode(course,'chinese',chinese,'math',math,'physics',physics) 
  FROM score ,T  ORDER BY username ,course;

wKiom1TJmVmAwnwpAADqXvmhWJg275.jpg


豎錶轉換橫表:

SELECT * FROM course;

wKioL1TJnuLCL1Q0AAC5VQD9hfw815.jpg

豎錶轉換橫表關鍵在於如何把多條記錄合併成一條記錄,按照username進行group by 使用聚合函數把多條合併成一條

SELECT username, 
       MAX(decode(course,'chinese',score)) chinese,
       MAX(decode(course,'math',score)) math,
       MAX(decode(course,'physics',score)) physics
  FROM course
GROUP BY username
ORDER BY username

wKiom1TJnvqwjPTbAABUbxTJVGU196.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章