天天看點

Oracle個人筆記:行轉列、列轉行

最近工作中遇到了幾次行轉列與列轉行的相關問題,雖然隻是小問題,但卻是資料庫資料進行中比較經典的案例,自己做下筆記,以做溫習之用。

一、行轉列小案例

測試表結構:

create table 成績表
(
  姓名 VARCHAR2(100),
  課程 VARCHAR2(100),
  分數 NUMBER(5)
)
           

測試資料:

insert into 成績表 (姓名, 課程, 分數) values ('小明', '資料結構', 82);
insert into 成績表 (姓名, 課程, 分數) values ('小明', '作業系統', 84);
insert into 成績表 (姓名, 課程, 分數) values ('小明', '計算機應用', 85);
insert into 成績表 (姓名, 課程, 分數) values ('小李', '資料結構', 92);
insert into 成績表 (姓名, 課程, 分數) values ('小李', '作業系統', 94);
insert into 成績表 (姓名, 課程, 分數) values ('小李', '計算機應用', 96);
insert into 成績表 (姓名, 課程, 分數) values ('小紅', '資料結構', 75);
insert into 成績表 (姓名, 課程, 分數) values ('小紅', '作業系統', 76);
insert into 成績表 (姓名, 課程, 分數) values ('小紅', '計算機應用', 71);
           
Oracle個人筆記:行轉列、列轉行
Oracle個人筆記:行轉列、列轉行

希望實作效果:

Oracle個人筆記:行轉列、列轉行
Oracle個人筆記:行轉列、列轉行

解決方案:可以通過group by對學生進行分組查詢,并結合sum()、decode()函數就可以實作行轉列的功能,具體實作SQL如下:

select t.姓名,
       sum(decode(t.課程, '資料結構', t.分數, null)) 資料結構,
       sum(decode(t.課程, '作業系統', t.分數, null)) 作業系統,
       sum(decode(t.課程, '計算機應用', t.分數, null)) 計算機應用
  from 成績表 t
 group by t.姓名
           

二、列轉行小案例

建立測試表:

create table 成績表02
as
select t.姓名,
       sum(decode(t.課程, '資料結構', t.分數, null)) 資料結構,
       sum(decode(t.課程, '作業系統', t.分數, null)) 作業系統,
       sum(decode(t.課程, '計算機應用', t.分數, null)) 計算機應用
  from 成績表 t
 group by t.姓名
           
Oracle個人筆記:行轉列、列轉行

希望實作效果:

Oracle個人筆記:行轉列、列轉行

解決方案:可以使用union all實作該功能,具體實作SQL如下:

select t.姓名, '資料結構' 課程, t.資料結構 分數 from 成績表02 t
union all
select t.姓名, '作業系統', t.作業系統 from 成績表02 t
union all
select t.姓名, '計算機應用', t.計算機應用 from 成績表02 t
order by 1