說(shuō)明:普通行列轉(zhuǎn)換(version 1.0)僅針對(duì)sql server 2000提供靜態(tài)和動(dòng)態(tài)寫(xiě)法,version 2.0增加sql server 2005的有關(guān)寫(xiě)法。問(wèn)題:假設(shè)有張學(xué)生成績(jī)表(tb)如下:姓名 課程 分?jǐn)?shù)張三 語(yǔ)文 74張三 數(shù)學(xué) 83張三 物理 93李四 語(yǔ)文 74李四 數(shù)學(xué) 84李四 物理 94 想變成(得到如下結(jié)果):姓名 語(yǔ)文 數(shù)學(xué) 物理---- ---- ---- ----李四 74 84 94張三 74 83 93-------------------*/createtabletb(姓名varchar(10) , 課程varchar(10) , 分?jǐn)?shù)int)insertintotbvalues('張三','語(yǔ)文',74)insertintotbvalues('張三','數(shù)學(xué)',83)insertintotbvalues('張三','物理',93)insertintotbvalues('李四','語(yǔ)文',74)insertintotbvalues('李四','數(shù)學(xué)',84)insertintotbvalues('李四','物理',94)go--SQL SERVER 2000 靜態(tài)SQL,指課程只有語(yǔ)文、數(shù)學(xué)、物理這三門(mén)課程。(以下同)select姓名as姓名 ,max(case課程when'語(yǔ)文'then分?jǐn)?shù)else0end) 語(yǔ)文,max(case課程when'數(shù)學(xué)'then分?jǐn)?shù)else0end) 數(shù)學(xué),max(case課程when'物理'then分?jǐn)?shù)else0end) 物理fromtbgroupby姓名--SQL SERVER 2000 動(dòng)態(tài)SQL,指課程不止語(yǔ)文、數(shù)學(xué)、物理這三門(mén)課程。(以下同)declare@sqlvarchar(8000)set@sql='select 姓名'select@sql=@sql+', max(case 課程 when'''+課程+'''then 分?jǐn)?shù) else 0 end) ['+課程+']'from(selectdistinct課程fromtb)asaset@sql=@sql+'from tb group by 姓名'exec(@sql)--SQL SERVER 2005 靜態(tài)SQL。select*from(select*fromtb) a pivot (max(分?jǐn)?shù))for課程in(語(yǔ)文,數(shù)學(xué),物理)) b--SQL SERVER 2005 動(dòng)態(tài)SQL。declare@sqlvarchar(8000)select@sql=isnull(@sql+'],[','')+課程fromtbgroupby課程set@sql='['+@sql+']'exec('select * from (select * from tb) a pivot (max(分?jǐn)?shù)) for 課程 in ('+@sql+')) b') |
新聞熱點(diǎn)
疑難解答
圖片精選