天天看點

SQL查詢 行轉列橫向顯示

參考:http://wenku.baidu.com/view/827ee5eff8c75fbfc77db261.html

create table tb(姓名 varchar(10) , 課程 varchar(10) , 分數 int)

insert into tb values('張三' , '國文' , 74)

insert into tb values('張三' , '數學' , 83)

insert into tb values('張三' , '實體' , 93)

insert into tb values('李四' , '國文' , 74)

insert into tb values('李四' , '數學' , 84)

insert into tb values('李四' , '實體' , 94)

go

--SQL SERVER 2000 靜态SQL,指課程隻有國文、數學、實體這三門課程。(以下同)

select 姓名 as 姓名 ,

max(case 課程 when '國文' then 分數 else 0 end) 國文,

max(case 課程 when '數學' then 分數 else 0 end) 數學,

max(case 課程 when '實體' then 分數 else 0 end) 實體

from tb

group by 姓名

--SQL SERVER 2000 動态SQL,指課程不止國文、數學、實體這三門課程。(以下同)

declare @sql varchar(8000)

set @sql = 'select 姓名 '

select @sql = @sql + ' , max(case 課程 when ''' + 課程 + ''' then 分數 else 0 end) [' + 課程 + ']'

from (select distinct 課程 from tb) as a

set @sql = @sql + ' from tb group by 姓名'

exec(@sql)

--SQL SERVER 2005 靜态SQL。

select * from (select * from tb) a pivot (max(分數) for 課程 in (國文,數學,實體)) b

--SQL SERVER 2005 動态SQL。

declare @sql varchar(8000)

select @sql = isnull(@sql + '],[' , '') + 課程 from tb group by 課程

set @sql = '[' + @sql + ']'

exec ('select * from (select * from tb) a pivot (max(分數) for 課程 in (' + @sql + ')) b')

---------------------------------

如果執行 後報錯 “資料庫的相容級别出錯,總報錯"'PIVOT' 附近有文法錯誤”

那麼執行一下存儲過程  dbName :為你的資料庫名稱 ;90 :為相容級别

EXEC   sp_dbcmptlevel dbName,90

其中dbName就是你要修改相容性的資料庫名,運作完畢後,重新運作上面的sql語句,執行成功

參考:http://wenku.baidu.com/view/827ee5eff8c75fbfc77db261.html