1. 程式人生 > >資料庫之行轉列與列轉行方法

資料庫之行轉列與列轉行方法

--建立縱表TABLE_A

CREATE TABLE TABLE_A (    NAME VARCHAR2(20),     SUBJECT VARCHAR2(20),     SCORE NUMBER(22,0));
--向表TABLE_A中插入資料
INSERT INTO TABLE_A (NAME, SUBJECT, SCORE) VALUES ('張三', '語文', 60);
INSERT INTO TABLE_A (NAME, SUBJECT, SCORE) VALUES ('張三', '數學', 70);
INSERT INTO TABLE_A (NAME, SUBJECT, SCORE) VALUES ('張三', '英語', 80);

INSERT INTO TABLE_A (NAME, SUBJECT, SCORE) VALUES ('李四', '語文', 90);
INSERT INTO TABLE_A (NAME, SUBJECT, SCORE) VALUES ('李四', '數學', 100);
插入資料後TABLE_A如下圖:
--建立縱表TABLE_B
CREATE TABLE TABLE_B (    NAME VARCHAR2(20),     CHINESE NUMBER(22,0),     MATH NUMBER(22,0),     ENGLISH NUMBER(22,0));

--向表TABLE_B中插入資料
INSERT INTO TABLE_B (NAME, CHINESE, MATH, ENGLISH) VALUES ('張三', 60, 70, 80);
INSERT INTO TABLE_B (NAME, CHINESE, MATH, ENGLISH) VALUES ('李四', 90, 100, 0);
插入資料後TABLE_B如下圖:
--縱錶轉橫表 TABLE_A-->TABLE_B
--方法一:使用case ... when ... then ... else ... end  函式
select name,
        sum (case subject when '語文' then score else 0 end) as chinese,
        sum (case subject when '數學' then score else 0 end) as math,
        sum (case subject when '英語' then score else 0 end) as english
        from Table_A
        group by name
--方法二:使用pivot
select * from Table_A pivot (max(score)for subject in('語文','數學','英語'))
--橫錶轉縱表 TABLE_B-->TABLE_A
--方法一:使用union all
select NAME,'語文' as SUBject,chinese as score from Table_B union all
select NAME,'數學' as SUBject,math as score from Table_B union all
select NAME,'英語' as SUBject,english as score from Table_B
order by name,subject desc
--方法二:使用unpivot
select name,subject,score from Table_B
unpivot
(score for subject in (chinese,math,english))