宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

语法:

PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现

PIVOT的一般语法是:PIVOT聚合函数列) FOR 列 in …) )AS P

完整语法:

table_source

PIVOT

聚合函数(value_column)

FOR pivot_column

IN<column_list>)

)

UNPIVOT用于将列明转为列值(即列转行),在SQL Server 2000可以用UNION来实现

完整语法:

table_source

UNPIVOT

value_column

FOR pivot_column

IN<column_list>)

)

注意:PIVOT、UNPIVOT是SQL Server 2005 的语法,使用需修改数据库兼容级别
 在数据库属性->选项->兼容级别改为   90

if object_id'tb')is not null drop table tb
go
create table tb姓名 varchar10),课程 varchar10),分数 int)
insert into tb values'张三','语文',74)
insert into tb values'张三','数学',83)
insert into tb values'张三','物理',93)
insert into tb values'李四','语文',74)
insert into tb values'李四','数学',84)
insert into tb values'李四','物理',94)
go

select * from tb

sql强大的行转列功能(内置函数pivot及注意事项)-风君子博客

方法一:

现在的问题是:我想根据姓名统计这个人的三门成绩,即:姓名   语文   数学  物理

首先看看使用case when end结构的时候:

select 姓名,
 maxcase 课程 when '语文' then 分数 else 0 end)语文,
 maxcase 课程 when '数学'then 分数 else 0 end)数学,
 maxcase 课程 when '物理'then 分数 else 0 end)物理
from tb
group by 姓名

sql强大的行转列功能(内置函数pivot及注意事项)-风君子博客

方法二:使用pivot函数

select * from tb pivotmax分数) for 课程 in 语文,数学,物理)) a

sql强大的行转列功能(内置函数pivot及注意事项)-风君子博客

上面查询前提是:

PIVOT、UNPIVOT是SQL Server 2005 的语法,使用需修改数据库兼容级别
 在数据库属性->选项->兼容级别改为   90

如果兼容级别不改为 90 ,查询结果如下:

sql强大的行转列功能(内置函数pivot及注意事项)-风君子博客