sqlserver PIVOT和UNPIVOT使用
一、使用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? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |