縱表、橫表互轉的SQL


縱表、橫表互轉的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]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM