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

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

这里主要说纵转横。

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

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

不用CASE用连接实现转换

方法一:

 

语文成绩表

select * 
from Table_A A
Where A.Course='语文'

数学成绩表
英语成绩表

 

纵表转横表 java 横纵表头转换_Code

纵表转横表 java 横纵表头转换_纵表转横表 java_02

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

 

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

改为左连

纵表转横表 java 横纵表头转换_Code

纵表转横表 java 横纵表头转换_纵表转横表 java_02

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

纵表转横表 java 横纵表头转换_Code

纵表转横表 java 横纵表头转换_纵表转横表 java_02

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