縱表、橫表互轉的SQL
By:大志若愚
1、建表:
縱表結構 Table_A
create table Table_A ( 姓名 varchar(20), 課程 varchar(20), 成績 int ) insert into Table_A(姓名,課程,成績) values('張三','語文',60) insert into Table_A(姓名,課程,成績) values('張三','數學',70) insert into Table_A(姓名,課程,成績) values('張三','英語',80) insert into Table_A(姓名,課程,成績) values('李四','語文',90) insert into Table_A(姓名,課程,成績) values('李四','數學',100)
姓名 |
課程 |
成績 |
張三 |
語文 |
60 |
張三 |
數學 |
70 |
張三 |
英語 |
80 |
李四 |
語文 |
90 |
李四 |
數學 |
100 |
橫表結構 Table_B
create table Table_B ( 姓名 varchar(20), 語文 int, 數學 int, 英語 int ) insert into Table_B(姓名,語文,數學,英語) values('張三',60,70,80) insert into Table_B(姓名,語文,數學,英語) values('李四',90,100,0)
姓名 |
語文 |
數學 |
英語 |
張三 |
60 |
70 |
80 |
李四 |
90 |
100 |
0 |
2、縱表變橫表
縱表結構 Table_A --> 橫表結構 Table_B
方法一:聚合函數[max或sum]配合case語句
select 姓名, sum (case 課程 when '語文' then 成績 else 0 end) as 語文, sum (case 課程 when '數學' then 成績 else 0 end) as 數學, sum (case 課程 when '英語' then 成績 else 0 end) as 英語 from Table_A group by 姓名
方法二:使用pivot
select * from Table_A pivot (max(成績)for 課程 in(語文,數學,英語)) 臨時表
3、橫表變縱表
橫表結構 Table_B --> 縱表結構 Table_A
方法一:union all
select 姓名,'語文' as 課程,語文 as 成績 from Table_B union all select 姓名,'數學' as 課程,數學 as 成績 from Table_B union all select 姓名,'英語' as 課程,英語 as 成績 from Table_B order by 姓名,課程 desc
方法二:使用unpivot
select 姓名,課程,成績 from Table_B unpivot (成績 for 課程 in ([語文],[數學],英語)) 臨時表
說明:在實際開發中表名,列名不應該使用漢字,在插入的值中有漢字的應該用N修飾,以防止出現亂碼,出現意想不到的結果,可能產生2異性的表名可以用[]修飾。
例如:
insert into Table_B(name,chinese,math,english) values(N'張三',60,70,80)
create table [user]