上一篇是横纵表转换的标准写法
横转纵没什么好说的,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
这里没有李四的数据,因为内连接没有数据
改为左连
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
好了,这下就可以了,再加个空值处理
方法二:
之后我们试试在查询里写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
+聚集函数
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