纵表、横表互转的SQL
縱表、橫表互轉(zhuǎn)的SQL
By:大志若愚
1、建表:
??? 縱表結(jié)構(gòu) Table_A?
create table Table_A (姓名 varchar(20),課程 varchar(20),成績 int ) insert into Table_A(姓名,課程,成績) values('張三','語文',60) insert into Table_A(姓名,課程,成績) values('張三','數(shù)學(xué)',70) insert into Table_A(姓名,課程,成績) values('張三','英語',80) insert into Table_A(姓名,課程,成績) values('李四','語文',90) insert into Table_A(姓名,課程,成績) values('李四','數(shù)學(xué)',100)?
| 姓名 | 課程 | 成績 |
| 張三 | 語文 | 60 |
| 張三 | 數(shù)學(xué) | 70 |
| 張三 | 英語 | 80 |
| 李四 | 語文 | 90 |
| 李四 | 數(shù)學(xué) | 100 |
?? 橫表結(jié)構(gòu) Table_B
create table Table_B (姓名 varchar(20),語文 int,數(shù)學(xué) int,英語 int ) insert into Table_B(姓名,語文,數(shù)學(xué),英語) values('張三',60,70,80) insert into Table_B(姓名,語文,數(shù)學(xué),英語) values('李四',90,100,0)?
| 姓名 | 語文 | 數(shù)學(xué) | 英語 |
| 張三 | 60 | 70 | 80 |
| 李四 | 90 | 100 | 0 |
2、縱表變橫表
縱表結(jié)構(gòu) Table_A?? -->??? 橫表結(jié)構(gòu) Table_B
方法一:聚合函數(shù)[max或sum]配合case語句
select 姓名, sum (case 課程 when '語文' then 成績 else 0 end) as 語文, sum (case 課程 when '數(shù)學(xué)' then 成績 else 0 end) as 數(shù)學(xué), sum (case 課程 when '英語' then 成績 else 0 end) as 英語 from Table_A group by 姓名方法二:使用pivot
select * from Table_A pivot (max(成績)for 課程 in(語文,數(shù)學(xué),英語)) 臨時(shí)表3、橫表變縱表
橫表結(jié)構(gòu) Table_B?? -->??? 縱表結(jié)構(gòu) Table_A
方法一:union all
select 姓名,'語文' as 課程,語文 as 成績 from Table_B union all select 姓名,'數(shù)學(xué)' as 課程,數(shù)學(xué) as 成績 from Table_B union all select 姓名,'英語' as 課程,英語 as 成績 from Table_B order by 姓名,課程 desc方法二:使用unpivot?
select 姓名,課程,成績 from Table_B unpivot (成績 for 課程 in ([語文],[數(shù)學(xué)],英語)) 臨時(shí)表?說明:在實(shí)際開發(fā)中表名,列名不應(yīng)該使用漢字,在插入的值中有漢字的應(yīng)該用N修飾,以防止出現(xiàn)亂碼,出現(xiàn)意想不到的結(jié)果,可能產(chǎn)生2異性的表名可以用[]修飾。
例如:
insert into Table_B(name,chinese,math,english) values(N'張三',60,70,80)
create table [user]
轉(zhuǎn)載于:https://www.cnblogs.com/liushen/p/3333936.html
總結(jié)
以上是生活随笔為你收集整理的纵表、横表互转的SQL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Visual C#来清空回收站(2)
- 下一篇: 2014/9/12 play with