固定列數的行列轉換
如表結構爲:
如
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