国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

sql server pivot/unpivot 行列互轉

2024-08-31 00:54:01
字體:
來源:轉載
供稿:網友
sql server pivot/unpivot 行列互轉

有時候會碰到行轉列的需求(也就是將列的值作為列名稱),通常我都是用 CASE END + 聚合函數來實現的。

如下:

declare @t table(StudentName nvarchar(20), Subject nvarchar(20), Score int)Insert into @t (StudentName,Subject,Score) values ( '學生A', '中文', 80 );    Insert into @t (StudentName,Subject,Score) values ( '學生A', '數學', 78 );    Insert into @t (StudentName,Subject,Score) values ( '學生A', '英語', 92 );    Insert into @t (StudentName,Subject,Score) values ( '學生B', '中文', 89 );    Insert into @t (StudentName,Subject,Score) values ( '學生B', '數學', 87 );    Insert into @t (StudentName,Subject,Score) values ( '學生B', '英語', 75 );    Insert into @t (StudentName,Subject,Score) values ( '學生C', '中文', 92 );    Insert into @t (StudentName,Subject,Score) values ( '學生C', '數學', 74 );    Insert into @t (StudentName,Subject,Score) values ( '學生C', '英語', 65 );    Insert into @t (StudentName,Subject,Score) values ( '學生D', '中文', 79 );    Insert into @t (StudentName,Subject,Score) values ( '學生D', '數學', 83 );    Insert into @t (StudentName,Subject,Score) values ( '學生D', '英語', 81 );    Insert into @t (StudentName,Subject,Score) values ( '學生E', '中文', 73 );    Insert into @t (StudentName,Subject,Score) values ( '學生E', '數學', 84 );    Insert into @t (StudentName,Subject,Score) values ( '學生E', '英語', 93 );    Insert into @t (StudentName,Subject,Score) values ( '學生F', '中文', 79 );    Insert into @t (StudentName,Subject,Score) values ( '學生F', '數學', 86 );    Insert into @t (StudentName,Subject,Score) values ( '學生F', '英語', 84 );   select StudentName,       sum(case when Subject = N'中文' then Score else 0 end) Chinese,       sum(case when Subject = N'數學' then Score else 0 end) Math,       sum(case when Subject = N'英語' then Score else 0 end) Engilsh  from @t group by StudentName

今天看到一個新的寫法,pivot 可以實現相同的功能(2005才開始支持)。

pivot 的語法為:

table_source

pivot(聚合函數(value_column)pivot_column for (columnlist))

稍微解釋一下:

table_source: 是我們要進行轉換的表。pivot_column: 就是要進行行轉列的列名。value_column:是轉換后列的值。columnlist 是要生成的列。

同樣是上面的例子,使用pivot 可以這樣寫得到同樣的結果:

select StudentName,       [中文] Chinese,       [數學] Math,       [英語] English  from (select * from @t) t1pivot (sum(Score) for Subject in([中文],[英語],[數學])) t2

與之對應的 unpivot 就是列轉行了(列名作為值),

unpivot 的語法為:

table_source

unpivot(value_column ubpivot_column for(columnlist))

參數的意義與pivot 是一樣的。這里我們可以簡單的把剛剛轉后的再轉回去,這樣就得到原來的表了:

select StudentName,       Subject,       Score  from (select * from @t) t1pivot (sum(Score) for Subject in([中文],[英語],[數學])) t2unpivot (Score for Subject in([中文],[英語],[數學])) t3

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 建昌县| 怀化市| 阿图什市| 烟台市| 和龙市| 云浮市| 和硕县| 思茅市| 永登县| 肃南| 长武县| 小金县| 皮山县| 伊宁市| 曲松县| 临邑县| 肥东县| 古交市| 宽甸| 集贤县| 金川县| 阿拉尔市| 双柏县| 固安县| 阳曲县| 宁化县| 浮山县| 米林县| 孙吴县| 米泉市| 奈曼旗| 临夏县| 霸州市| 大兴区| 鲜城| 唐山市| 永城市| 通河县| 阳西县| 德阳市| 新兴县|