使用 case when进行行列转换
生活随笔
收集整理的這篇文章主要介紹了
使用 case when进行行列转换
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
固定列數(shù)的行列轉(zhuǎn)換
??如表結(jié)構(gòu)為: ? ??
?? ? 如?
Name ? subject score?
---------------------------?
張三 ? 語(yǔ)文 ? 80?
張三 ? 數(shù)學(xué) ? 70?
張三 ? 英語(yǔ) ? 60?
李四 ? 語(yǔ)文 ? 90?
李四 ? 數(shù)學(xué) ? 80?
李四 ? 英語(yǔ) ? 100?
....
?? ?轉(zhuǎn)換為 :
?? ? ? ? ? ? ? 語(yǔ)文 ? 數(shù)學(xué) ? 英語(yǔ)?
?? ? ? 張三 ? ?80 ? ? 70 ? ? 60?
?? ? ? 李四 ? ?90 ? ? 80 ? ?100?
要求:創(chuàng)建表,源表,表名: Stu , 只用一句sql 得到轉(zhuǎn)換結(jié)果。
解答:
方法一 :通過(guò)生成臨時(shí)表的方式操作
select name ,sum(yw) as '語(yǔ)文',sum(sx) ?as '數(shù)學(xué)',sum(wy) as '英語(yǔ)'
from(?
select name ,?
CASE subject WHEN '語(yǔ)文' THEN score END AS yw,?
CASE subject WHEN '數(shù)學(xué)' THEN score END AS sx,?
CASE subject WHEN '英語(yǔ)' THEN score END AS wy?
from ?Stu?
) tempStu
group by name
方法二:課程只有語(yǔ)文、數(shù)學(xué)、物理這三門(mén)課程則可以使用靜態(tài)sql 來(lái)實(shí)現(xiàn) ?Sql2000
select name as 姓名,?
??max(case subject when '語(yǔ)文' then score else 0 end) 語(yǔ)文,?
??max(case subject when '數(shù)學(xué)' then score else 0 end) 數(shù)學(xué),?
??max(case subject when '英語(yǔ)' then score else 0 end) 英語(yǔ)
from Stu?
group by name
方法三:如果課程不止語(yǔ)文、數(shù)學(xué)、物理這三門(mén)課程 則可以使用動(dòng)態(tài)sql 來(lái)實(shí)現(xiàn)
?? ? ? 創(chuàng)建一個(gè)用戶(hù)變量,使用簡(jiǎn)單的T-SQL來(lái)實(shí)現(xiàn)。 Sql2000
declare @sql varchar(8000) ? ? --聲明一個(gè)變量
set @sql = 'select name as 姓名'?
select @sql = @sql + ' , max(case subject when ''' + subject+ ''' then score ?else 0 end) [' + subject+ ']'?
from (select distinct subject from Stu) as a?
set @sql = @sql + ' from Stu group by name'?
print @sql ? --打印生成的sql
exec(@sql) ? --執(zhí)行該sql
??注:?case when的作用就是一個(gè)條件選擇語(yǔ)句,根據(jù)不同的要求顯示不同的內(nèi)容,格式是這樣的case
?????? when [選擇條件]
?????? then [結(jié)果1]
?????? else [結(jié)果2]
?????? end
?? 其中[選擇條件]也可以放在case之后。 CASE WHEN語(yǔ)句在DB2,ORACLE,SQL SERVER系列,SYBASE等大型數(shù)據(jù)庫(kù)都受到支持,是標(biāo)準(zhǔn)的SQL語(yǔ)句.
??如表結(jié)構(gòu)為: ? ??
?? ? 如?
Name ? subject score?
---------------------------?
張三 ? 語(yǔ)文 ? 80?
張三 ? 數(shù)學(xué) ? 70?
張三 ? 英語(yǔ) ? 60?
李四 ? 語(yǔ)文 ? 90?
李四 ? 數(shù)學(xué) ? 80?
李四 ? 英語(yǔ) ? 100?
....
?? ?轉(zhuǎn)換為 :
?? ? ? ? ? ? ? 語(yǔ)文 ? 數(shù)學(xué) ? 英語(yǔ)?
?? ? ? 張三 ? ?80 ? ? 70 ? ? 60?
?? ? ? 李四 ? ?90 ? ? 80 ? ?100?
要求:創(chuàng)建表,源表,表名: Stu , 只用一句sql 得到轉(zhuǎn)換結(jié)果。
解答:
方法一 :通過(guò)生成臨時(shí)表的方式操作
select name ,sum(yw) as '語(yǔ)文',sum(sx) ?as '數(shù)學(xué)',sum(wy) as '英語(yǔ)'
from(?
select name ,?
CASE subject WHEN '語(yǔ)文' THEN score END AS yw,?
CASE subject WHEN '數(shù)學(xué)' THEN score END AS sx,?
CASE subject WHEN '英語(yǔ)' THEN score END AS wy?
from ?Stu?
) tempStu
group by name
方法二:課程只有語(yǔ)文、數(shù)學(xué)、物理這三門(mén)課程則可以使用靜態(tài)sql 來(lái)實(shí)現(xiàn) ?Sql2000
select name as 姓名,?
??max(case subject when '語(yǔ)文' then score else 0 end) 語(yǔ)文,?
??max(case subject when '數(shù)學(xué)' then score else 0 end) 數(shù)學(xué),?
??max(case subject when '英語(yǔ)' then score else 0 end) 英語(yǔ)
from Stu?
group by name
方法三:如果課程不止語(yǔ)文、數(shù)學(xué)、物理這三門(mén)課程 則可以使用動(dòng)態(tài)sql 來(lái)實(shí)現(xiàn)
?? ? ? 創(chuàng)建一個(gè)用戶(hù)變量,使用簡(jiǎn)單的T-SQL來(lái)實(shí)現(xiàn)。 Sql2000
declare @sql varchar(8000) ? ? --聲明一個(gè)變量
set @sql = 'select name as 姓名'?
select @sql = @sql + ' , max(case subject when ''' + subject+ ''' then score ?else 0 end) [' + subject+ ']'?
from (select distinct subject from Stu) as a?
set @sql = @sql + ' from Stu group by name'?
print @sql ? --打印生成的sql
exec(@sql) ? --執(zhí)行該sql
??注:?case when的作用就是一個(gè)條件選擇語(yǔ)句,根據(jù)不同的要求顯示不同的內(nèi)容,格式是這樣的case
?????? when [選擇條件]
?????? then [結(jié)果1]
?????? else [結(jié)果2]
?????? end
?? 其中[選擇條件]也可以放在case之后。 CASE WHEN語(yǔ)句在DB2,ORACLE,SQL SERVER系列,SYBASE等大型數(shù)據(jù)庫(kù)都受到支持,是標(biāo)準(zhǔn)的SQL語(yǔ)句.
總結(jié)
以上是生活随笔為你收集整理的使用 case when进行行列转换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Oracle之外部表
- 下一篇: Oracle 行列转换