| ylbtech-SQL Server:使用 PIVOT 行转列和 UNPIVOT 列转行 |
可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表。PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。UNPIVOT 与 PIVOT 执行相反的操作,将表值表达式的列转换为列值。
【注】对升级到 SQL Server 2005 或更高版本的数据库使用 PIVOT 和 UNPIVOT 时,必须将数据库的兼容级别设置为 90 或更高。有关如何设置数据库兼容级别的信息,请参阅 sp_dbcmptlevel (Transact-SQL)。
| A,PIVOT 语法 返回顶部 |
1、
PIVOT 提供的语法比一系列复杂的 SELECT...CASE 语句中所指定的语法更简单和更具可读性。有关 PIVOT 语法的完整说明,请参阅 FROM (Transact-SQL)。
以下是带批注的 PIVOT 语法。
SELECT <非透视的列>, [第一个透视的列] AS <列名称>, [第二个透视的列] AS <列名称>, ... [最后一个透视的列] AS <列名称>, FROM (<生成数据的 SELECT 查询>) AS <源查询的别名> PIVOT ( <聚合函数>(<要聚合的列>) FOR [<包含要成为列标题的值的列>] IN ( [第一个透视的列], [第二个透视的列], ... [最后一个透视的列]) ) AS <透视表的别名> <可选的 ORDER BY 子句>;
2、
| B,PIVOT 示例1返回顶部 |
0、
go -- ========================== -- 学生成绩表,ByYuanbo -- ========================== -- drop table StudentScores; create table StudentScores ( username varchar(20), --姓名 [subject] varchar(30), --科目 score float, --成绩 ); go -- 01、插入测试数据 insert into StudentScores(username,[subject],score) values('张三', '语文', 80); insert into StudentScores(username,[subject],score) values('张三', '语文', 90); insert into StudentScores(username,[subject],score) values('张三', '数学', 90); insert into StudentScores(username,[subject],score) values('张三', '英语', 70); insert into StudentScores(username,[subject],score) values('张三', '生物', 85); insert into StudentScores(username,[subject],score) values('李四', '语文', 70); insert into StudentScores(username,[subject],score) values('李四', '数学', 92); insert into StudentScores(username,[subject],score) values('李四', '数学', 100); insert into StudentScores(username,[subject],score) values('李四', '英语', 76); insert into StudentScores(username,[subject],score) values('李四', '生物', 88); insert into StudentScores(username,[subject],score) values('王二', '语文', 60); insert into StudentScores(username,[subject],score) values('王二', '数学', 82); insert into StudentScores(username,[subject],score) values('王二', '英语', 96); insert into StudentScores(username,[subject],score) values('王二', '生物', 78); go -- 02、查询数据 select * from StudentScores; --P1、如果我想知道每位学生的每科成绩,而且每个学生的全部成绩排成一行,这样方便我查看、统计,导出数据 --A1、传统 case 方法 select username as '姓名' ,max(case [subject] when '语文' then score else 0 end) as '语文' ,max(case [subject] when '数学' then score else 0 end) as '数学' ,max(case [subject] when '英语' then score else 0 end) as '英语' ,max(case [subject] when '生物' then score else 0 end) as '生物' from StudentScores group by username; /* 以下是带批注的 PIVOT 语法。 SELECT <非透视的列>, [第一个透视的列] AS <列名称>, [第二个透视的列] AS <列名称>, ... [最后一个透视的列] AS <列名称>, FROM (<生成数据的 SELECT 查询>) AS <源查询的别名> PIVOT ( <聚合函数>(<要聚合的列>) FOR [<包含要成为列标题的值的列>] IN ( [第一个透视的列], [第二个透视的列], ... [最后一个透视的列]) ) AS <透视表的别名> <可选的 ORDER BY 子句>; */ go -- A2:PIVOT 方法 select username as '姓名',[语文],[数学],[英语],[生物] from StudentScores a PIVOT ( max(a.score) for a.subject in([语文],[数学],[英语],[生物]) )b;