浅谈SQLServer行列转换PIVOT函数的使用
2017-08-04 13:54
148 查看
以学生表举个例子,展现学生的各门学科和成绩,我们先新建一张表(表中插入测试值的时候用到了rand取随机数,没用过的可以了解下-->点击打开):
这张表的呈现形式如下:
通过行列转换函数:
这边需要留意一下PIVOT函数使用的结构了,首先是写一个查询语句,然后是对这个查询结果集中的某一列的值进行了行列转换的操作(我这里是把学科这一列的值“语文、数学、英语”转换为列),其中还必须包含了一个聚集函数(聚集函数一共有5个,分别是:count、sum、max、min、avg,无论是用哪一个聚集函数都代表着不同的意义,我这里用的MAX,针对这里聚集函数的使用我在后面的篇章中有讲到-->点击打开)
呈现形式如下:
注:pivot函数前面接的一定是一条查询语句,我上面的这条例子查询语句比较简单,直接select * from 也就通过了,最终结果也没有报错,其实正规来讲,如果select 语句比较复杂,这种写法可能会报错的,下面有一种保险一点的写法:
SELECT * FROM (
--这里写复杂的sql查询语句
) a
PIVOT(--此次省略相关code) AS PVT
之前的例子可以这样写:
和PIVOT相反的还有一个UNPIVOT行数,顾名思义,一个是“行转列”另一个就是“列转行”,好了,这个函数的使用方法我会在下一篇介绍~~
Create Table Students(Name varchar(10), Subject Nvarchar(10),Score int) Insert into Students Select 'Andy' ,'Chiness',round(60+40*rand(),0) Union all Select 'Burgess' ,'Chiness',round(60+40*rand(),0) Union all Select 'Ula' ,'Chiness',round(60+40*rand(),0) Union all Select 'Lily' ,'Chiness',round(60+40*rand(),0) Union all Select 'Demon' ,'Chiness',round(60+40*rand(),0) Union all Select 'Andy' ,'Math',round(60+40*rand(),0) Union all Select 'Burgess' ,'Math',round(60+40*rand(),0) Union all Select 'Ula' ,'Math',round(60+40*rand(),0) Union all Select 'Lily' ,'Math',round(60+40*rand(),0) Union all Select 'Demon' ,'Math',round(60+40*rand(),0) Union all Select 'Andy' ,'English',round(60+40*rand(),0) Union all Select 'Burgess' ,'English',round(60+40*rand(),0) Union all Select 'Ula' ,'English',round(60+40*rand(),0) Union all Select 'Lily' ,'English',round(60+40*rand(),0) Union all Select 'Demon' ,'English',round(60+40*rand(),0)
这张表的呈现形式如下:
通过行列转换函数:
SELECT * FROM Students PIVOT(MAX(SCORE) FOR Subject IN(Chiness,Math,English) ) AS PVT
这边需要留意一下PIVOT函数使用的结构了,首先是写一个查询语句,然后是对这个查询结果集中的某一列的值进行了行列转换的操作(我这里是把学科这一列的值“语文、数学、英语”转换为列),其中还必须包含了一个聚集函数(聚集函数一共有5个,分别是:count、sum、max、min、avg,无论是用哪一个聚集函数都代表着不同的意义,我这里用的MAX,针对这里聚集函数的使用我在后面的篇章中有讲到-->点击打开)
呈现形式如下:
注:pivot函数前面接的一定是一条查询语句,我上面的这条例子查询语句比较简单,直接select * from 也就通过了,最终结果也没有报错,其实正规来讲,如果select 语句比较复杂,这种写法可能会报错的,下面有一种保险一点的写法:
SELECT * FROM (
--这里写复杂的sql查询语句
) a
PIVOT(--此次省略相关code) AS PVT
之前的例子可以这样写:
SELECT * FROM ( SELECT * FROM Students ) a PIVOT(MAX(SCORE) FOR Subject IN(Chiness,Math,English) ) AS PVT最终的执行结果是一样的!
和PIVOT相反的还有一个UNPIVOT行数,顾名思义,一个是“行转列”另一个就是“列转行”,好了,这个函数的使用方法我会在下一篇介绍~~
相关文章推荐
- SQLServer行列转换PIVOT函数中聚合函数的使用意义及选择
- sql2005《新》行列转换的使用(使用pivot函数)
- SQLServer行列转换 Pivot UnPivot
- SQLServer中行列转换Pivot UnPivot
- SQLServer行列转换 Pivot UnPivot
- 在Sqlserver下巧用行列转换日期的数据统计
- SQL行列转换,PIVOT与UNPIVOT的区别和使用方法举例
- MSSQL2005行列转换(使用PIVOT and UNPIVOT)
- SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例,合并列的例子
- Sqlserver 纯粹意义上的行列转换--【叶子】
- Sql Server函数大全(二)---SQL Server 2005 中行列转换(Pivot 和 UNPivot的使用)
- SQL查询案例:行列转换[行转列, 使用 CASE WHEN 处理]
- SQL Server 行列相互转换命令:PIVOT和UNPIVOT使用详解
- Sql Server函数大全(二)---SQL Server 2005 中行列转换(Pivot 和 UNPivot的使用)
- excel使用--行列转换
- SQLServer行列转换 Pivot UnPivot 动态实现
- sqlserver行列转换问题(网上搜集)
- 使用分析函数进行行列转换
- SQLServer行列转换 Pivot UnPivot
- 使用Pivot进行行列转换不能合并为一行的问题