實現行列轉換

固定列數的行列轉換
 如表結構爲:    
    如

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語句


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章