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