横纵表转换的几种方法

上一篇是横纵表转换的标准写法

横转纵没什么好说的,unin,大家都熟悉。

这里主要说纵转横。

横转纵与纵转横相对,那么,与unin相对的命令是什么?

JOIN,说到这里,可能有很多人已经明白之后的主要内容了。

不用CASE用连接实现转换

方法一:

 

语文成绩表

select * 

from Table_A A

Where A.Course='语文'

数学成绩表
英语成绩表

 

select A.Name,A.Grade as 语文,B.Grade as 数学,C.Grade as 英语 from

(select * 

from Table_A A

Where A.Course='语文') A,

(select * 

from Table_A A

Where A.Course='数学') B,

(select *

from Table_A A

Where A.Course='英语') C

where A.Name=B.Name 

and B.Name=C.Name
View Code

 


这里没有李四的数据,因为内连接没有数据


改为左连

select A.Name,ISNULL(A.Grade,0) as 语文,ISNULL(B.Grade,0) as 数学,ISNULL(C.Grade,0) as 英语 from

(select * 

from Table_A A

Where A.Course='语文') A

left join 

(select * 

from Table_A A

Where A.Course='数学') B

on A.Name=B.Name

left join

(select *

from Table_A A

Where A.Course='英语') C

on B.Name=C.Name
View Code

 

好了,这下就可以了,再加个空值处理

方法二:

之后我们试试在查询里写select

select Distinct(A.Name),

ISNULL((select Grade from Table_A B where B.Course='语文' and A.Name=B.Name),0)as 语文,

ISNULL((select Grade from Table_A B where B.Course='数学' and A.Name=B.Name),0)as 数学,

ISNULL((select Grade from Table_A B where B.Course='英语' and A.Name=B.Name),0)as 英语

from Table_A A

也可以不用Distinck用Group分组。

有何感想? 

 

再贴下最标准的方法了,而且不用多表的关联效率用了CASE和聚集函数。

这种方式不用表间连接,效率最高,前面的只是复习加练习,加深理解,要用还用标准的。

CASE

select Name,(case Course when '语文' then Grade else 0 end) as 语文,

(case Course when '数学' then Grade else 0 end) as 数学,

(case Course when '英语' then Grade else 0 end) as 英语

from Table_A
View Code

 

+聚集函数

select Name, 



sum(case Course when ‘语文‘ then Grade else 0 end) as 语文,



sum(case Course when ‘数学‘ then Grade else 0 end) as 数学,



sum(case Course when ‘英语‘ then Grade else 0 end) as 英语 



from TableA 



group by Name 

 

 

你可能感兴趣的:(转换)