国产探花免费观看_亚洲丰满少妇自慰呻吟_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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 吉安县| 天峨县| 凉山| 呼和浩特市| 邵阳市| 榆树市| 从江县| 天祝| 万山特区| 焉耆| 海林市| 拉萨市| 庐江县| 饶阳县| 揭东县| 屏东县| 济阳县| 华容县| 华池县| 高邮市| 神农架林区| 临漳县| 邮箱| 阿克苏市| 大石桥市| 婺源县| 深州市| 武宣县| 宁晋县| 平原县| 华池县| 运城市| 溆浦县| 延边| 斗六市| 黔东| 光泽县| 海伦市| 武宣县| 冕宁县| 瑞丽市|