說明:普通行列轉換(version 1.0)僅針對sql server 2000提供靜態和動態寫法,version 2.0增加sql server 2005的有關寫法。問題:假設有張學生成績表(tb)如下:姓名 課程 分數張三 語文 74張三 數學 83張三 物理 93李四 語文 74李四 數學 84李四 物理 94 想變成(得到如下結果):姓名 語文 數學 物理---- ---- ---- ----李四 74 84 94張三 74 83 93-------------------*/createtabletb(姓名varchar(10) , 課程varchar(10) , 分數int)insertintotbvalues('張三','語文',74)insertintotbvalues('張三','數學',83)insertintotbvalues('張三','物理',93)insertintotbvalues('李四','語文',74)insertintotbvalues('李四','數學',84)insertintotbvalues('李四','物理',94)go--SQL SERVER 2000 靜態SQL,指課程只有語文、數學、物理這三門課程。(以下同)select姓名as姓名 ,max(case課程when'語文'then分數else0end) 語文,max(case課程when'數學'then分數else0end) 數學,max(case課程when'物理'then分數else0end) 物理fromtbgroupby姓名--SQL SERVER 2000 動態SQL,指課程不止語文、數學、物理這三門課程。(以下同)declare@sqlvarchar(8000)set@sql='select 姓名'select@sql=@sql+', max(case 課程 when'''+課程+'''then 分數 else 0 end) ['+課程+']'from(selectdistinct課程fromtb)asaset@sql=@sql+'from tb group by 姓名'exec(@sql)--SQL SERVER 2005 靜態SQL。select*from(select*fromtb) a pivot (max(分數)for課程in(語文,數學,物理)) b--SQL SERVER 2005 動態SQL。declare@sqlvarchar(8000)select@sql=isnull(@sql+'],[','')+課程fromtbgroupby課程set@sql='['+@sql+']'exec('select * from (select * from tb) a pivot (max(分數) for 課程 in ('+@sql+')) b') |
新聞熱點
疑難解答