加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sqlserver PIVOT和UNPIVOT使用

发布时间:2020-12-12 13:42:54 所属栏目:MsSql教程 来源:网络整理
导读:一、使用PIVOT和UNPIVOT命令的SQL Server版本要求 1.数据库的最低版本要求为SQL Server 2005 或更高。 2.必须将数据库的兼容级别设置为90 或更高。 3.查看我的数据库版本及兼容级别。 查看本版本命令:print @@version 使用PIVOT 实现数据表的列转行 1.在这
一、使用PIVOT和UNPIVOT命令的SQL Server版本要求
1.数据库的最低版本要求为SQL Server 2005 或更高。
2.必须将数据库的兼容级别设置为90 或更高。
3.查看我的数据库版本及兼容级别。
查看本版本命令:print @@version
使用PIVOT 实现数据表的列转行
1.在这里我们先构建一个测试数据表(这里使用的是临时表,以方便我们在退出会话的时候自动删除表及其数据)
首先我们先设计一个表架构为#Student { 学生编号[PK],?姓名,性别,所属班级 }的表,然后编写如下T-SQL
表结构:
CREATE TABLE #Student ( ? ? [学生编号] INT IDENTITY(1,1) PRIMARY KEY,? ? [姓名] NVARCHAR(20),? ? [性别] NVARCHAR(1),? ? [所属班级] NVARCHAR(20) ? ? );?
插入数据 INSERT INTO #Student ( ? ? [姓名],[性别],[所属班级] ? ? ) ? ? SELECT '李妹妹','女','初一 1班' UNION ALL ? ? SELECT '泰强','男','初一 1班' UNION ALL ? ? SELECT '泰映','初一 1班' UNION ALL ? ? SELECT '何谢','初一 1班' UNION ALL ? ? SELECT '李春','初二 1班' UNION ALL ? ? SELECT '吴歌','初二 1班' UNION ALL ? ? SELECT '林纯','初二 1班' UNION ALL ? ? SELECT '徐叶','初二 1班' UNION ALL ? ? SELECT '龙门','初三 1班' UNION ALL ? ? SELECT '小红','初三 1班' UNION ALL ? ? SELECT '小李','初三 1班' UNION ALL ? ? SELECT '小黄','初三 2班' UNION ALL ? ? SELECT '旺财','初三 2班' UNION ALL ? ? SELECT '强强','初二 1班';?
2.查询各班级的总人数
SELECT ? ? [所属班级] AS [班级],? ? COUNT(1) AS [人数] ? ? FROM #Student ? ? GROUP BY [所属班级] ? ? ORDER BY [人数] DESC?

把上面的表{ 班级,人数 } 由 班级[行] 的显示转换为 班级[列] 的显示格式!
在此你会看到第一个PIVOT示例。
3.编写第一个PIVOT示例
SELECT ? ? '班级总人数:' AS [总人数],? ? [初一 1班],[初一 2班],? ? [初二 1班],? ? [初三 1班],[初三 2班] ? ? FROM ( ? ? SELECT ? ? [所属班级] AS [班级],? ? [学生编号] ? ? FROM #Student ? ? ) AS [SourceTable] ? ? PIVOT ( ? ? COUNT([学生编号]) ? ? FOR [班级] IN ( ? ? [初一 1班],[初三 2班] ? ? ) ? ? ) AS [PivotTable]?

语法:


SELECT ?

?

<未透视的列>,?

[第一个透视列] AS <列别名>,248)"> [第二个透视列] AS <列别名>,248)"> ... ?

[最后一个透视列] AS <列别名>?

FROM ( ?

<SELECT查询>?

) AS <源表>?

PIVOT ( ?

<聚合函数>(<列>) ?

FOR [<需要转换为行的列>] IN ( ?

[第一个透视列],[第二个透视列],248)"> [最后一个透视列] ?

) ?

) AS <数据透视表>?

<可选的ORDER BY子句>;?

以上的PIVOT子句内的第1…n个透视列的值均为需要转换为行的列的常量值,需要用[]括起,支持GUID,字符串及各种数字!

4.下面演示一个较为高级的行转列的应用示例

--使用PIVOT查询班级内的男女学生人数及总人数

[所属班级] AS [班级],248)"> [男] AS [男生人数],248)"> [女] AS [女生人数],248)"> [男] + [女] AS [总人数] ?

SELECT [学生编号],[所属班级],[性别] FROM #Student ?

) AS [SourceTable] ?

COUNT([学生编号]) ?

FOR [性别] IN ( ?

[男],[女] ?

) AS [PivotTable] ?

ORDER BY [总人数] DESC?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读