1、1: 行转列子查询,获取一定数据集结果SELECT objid,action,count(1) AS count FROM T_MyAttention WHERE objid IN(SELECT TOP 10 objid FROM T_MyAttention tma GROUP BY objid ORDER BY count(1) DESC)GROUP BY objid,action下面用 行转列语法获取 最终结果select *from (SELECT objid,action,count(1) AS count FROM T_MyAttention WHERE objid IN(SELEC
2、T TOP 10 objid FROM T_MyAttention tma GROUP BY objid ORDER BY count(1) DESC)GROUP BY objid,action) tpivot ( sum(count) for t.action in (1,2,3,4) as ourpivot微软官方的图:2: 列转行怎么把一条记录拆分成几条记录?User No. A B C1 1 21 34 241 2 42 25 16RESULT:User No. Type Num1 1 A 211 1 B 341 1 C 241 2 A 421 2 B 251 2 C 16declar
3、e t table(usser int ,no int ,a int,b int, c int)insert into t select 1,1,21,34,24union all select 1,2,42,25,16SELECT usser,no,Type=attribute, Num=valueFROM tUNPIVOT(value FOR attribute IN(a, b, c) AS UPV列转行备注 value FOR attribute IN(a, b, c) 这句话中,a,b,c 是列的名字,但是列名不能出现在上句的 select 语句中。-结果/*usser no Type
4、 num- - - -1 1 a 211 1 b 341 1 c 241 2 a 421 2 b 251 2 c 16*/T-SQL 语句中,PIVOT 命令可以实现数据表的列转行,UNPIVOT 则与其相反,实现数据的行转列。本文结合实例说明了这一过程,希望能对您有所帮助。AD: WOT2015 互联网运维与开发者大会 热销抢票一、使用 PIVOT 和 UNPIVOT 命令的 SQL Server 版本要求1.数据库的最低版本要求为 SQL Server 2005 或更高。2.必须将数据库的兼容级别设置为 90 或更高。3.查看我的数据库版本及兼容级别。如果不知道怎么看数据库版本或兼容级别的
5、话可以在 SQL Server Management Studio新建一个查询窗口输入:print version,运行之后在我的本机上得到:Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (Intel X86)Apr 2 2010 15:53:02Copyright (c) Microsoft CorporationExpress Edition with Advanced Services on Windows NT 5.2 (Build 3790: Service Pack 2)然后我们选择一个数据库然后右键-属性 选择选项得到下图的信
6、息。在确认数据库的版本和兼容级别符合 1,2 点的要求后你才可以接着继续往下学习。二、使用 PIVOT 实现数据表的列转行1.在这里我们先构建一个测试数据表(这里使用的是临时表,以方便我们在退出会话的时候自动删除表及其数据)首先我们先设计一个表架构为#Student 学生编号PK, 姓名, 性别, 所属班级 的表,然后编写如下 T-SQL-创建临时表(仅演示,表结构的不合理还请包涵)1. CREATE TABLE #Student ( 2. 3. 学生编号 INT IDENTITY(1, 1) PRIMARY KEY, 4. 5. 姓名 NVARCHAR(20), 6. 7. 性别 NVARC
7、HAR(1), 8. 9. 所属班级 NVARCHAR(20) 10. 11.); -给临时表插入数据1. INSERT INTO #Student ( 2. 3. 姓名, 性别 , 所属班级 4. 5. ) 6. 7. SELECT 李妹妹, 女, 初一 1 班 UNION ALL 8. 9. SELECT 泰强, 男, 初一 1 班 UNION ALL 10. 11.SELECT 泰映, 男, 初一 1 班 UNION ALL 12. 13.SELECT 何谢, 男, 初一 1 班 UNION ALL 14. 15.SELECT 李春, 男, 初二 1 班 UNION ALL 16. 17
8、.SELECT 吴歌, 男, 初二 1 班 UNION ALL 18. 19.SELECT 林纯, 男, 初二 1 班 UNION ALL 20. 21.SELECT 徐叶, 女, 初二 1 班 UNION ALL 22. 23.SELECT 龙门, 男, 初三 1 班 UNION ALL 24. 25.SELECT 小红, 女, 初三 1 班 UNION ALL 26. 27.SELECT 小李, 男, 初三 1 班 UNION ALL 28. 29.SELECT 小黄, 女, 初三 2 班 UNION ALL 30. 31.SELECT 旺财, 男, 初三 2 班 UNION ALL 32
9、. 33.SELECT 强强, 男, 初二 1 班; 以下是查询的结果:学生编号 姓名性别所属班级1李妹妹 女初一 1 班2 泰强 男初一 1 班3 泰映 男初一 1 班4 何谢 男初一 1 班5 李春 男初二 1 班6 吴歌 男初二 1 班7 林纯 男初二 1 班8 徐叶 女初二 1 班9 龙门 男初三 1 班10 小红 女初三 1 班11 小李 男初三 1 班12 小黄 女初三 2 班13 旺财 男初三 2 班14 强强 男初二 1 班2.查询各班级的总人数1. SELECT 2. 3. 所属班级 AS 班级, 4. 5. COUNT(1) AS 人数 6. 7. FROM #Studen
10、t 8. 9. GROUP BY 所属班级 10. 11.ORDER BY 人数 DESC 班级人数初二 1班 5初一 1班 4初三 1班 3初三 2班 2好了,在这里我希望把上面的表 班级, 人数 由 班级行 的显示转换为 班级列 的显示格式!在此你会看到第一个 PIVOT 示例。是否很期待?3.编写第一个 PIVOT 示例1. SELECT 2. 3. 班级总人数: AS 总人数 , 4. 5. 初一 1 班, 初一 2 班, 6. 7. 初二 1 班, 8. 9. 初三 1 班, 初三 2 班 10. 11.FROM ( 12. 13.SELECT 14. 15.所属班级 AS 班级,
11、16. 17.学生编号 18. 19.FROM #Student 20. 21.) AS SourceTable 22. 23.PIVOT ( 24. 25.COUNT(学生编号) 26. 27.FOR 班级 IN ( 28. 29.初一 1 班, 初一 2 班, 30. 31.初二 1 班, 32. 33.初三 1 班, 初三 2 班 34. 35.) 36. 37.) AS PivotTable 在结果表中我们看到了对于不存在的班级初一 2 班它的总人数为 0,这符合我们预期的结果!解释:使用 POVIT 首先你需要在 FROM 子句内定义 2 个表:A.一个称为源表(SourceTabl
12、e)。B.另一个称为数据透视表(PivotTable)。语法:1. SELECT 2. 3. , 4. 5. 第一个透视列 AS , 6. 7. 第二个透视列 AS , 8. 9. . 10. 11.最后一个透视列 AS 12. 13.FROM ( 14. 15. 16. 17.) AS 18. 19.PIVOT ( 20. 21.() 22. 23.FOR IN ( 24. 25.第一个透视列, 第二个透视列, 26. 27 28. 29.最后一个透视列 30. 31.) 32. 33.) AS 34. 35.; 以上的 PIVOT 子句内的第 1n 个透视列的值均为需要转换为行的列的常量值
13、,需要用括起,支持 GUID,字符串及各种数字!4.下面演示一个较为高级的行转列的应用示例-使用 PIVOT 查询班级内的男女学生人数及总人数1. SELECT 2. 3. 所属班级 AS 班级, 4. 5. 男 AS 男生人数, 6. 7. 女 AS 女生人数, 8. 9. 男 + 女 AS 总人数 10. 11.FROM ( 12. 13.SELECT 学生编号, 所属班级, 性别 FROM #Student 14. 15.) AS SourceTable 16. 17.PIVOT ( 18. 19.COUNT(学生编号) 20. 21.FOR 性别 IN ( 22. 23.男, 女 24
14、. 25.) 26. 27.) AS PivotTable 28. 29.ORDER BY 总人数 DESC 三、使用 UNPIVOT 实现的功能其实与 PIVOT 恰恰相反1.语法同 PIVOT 但是 UNPIVOT 的子句没有聚合函数1. SELECT 2. 3. , 4. 5. 合并后的列 AS , 6. 7. 行值的列名 AS 8. 9. FROM ( 10. 11. 12. 13.) AS 14. 15.UNPIVOT ( 16. 17. 18. 19.FOR IN ( 20. 21.第一个合并列, 第二个合并列, 22. 23 24. 25.最后一个合并列 26. 27.) 28.
15、 29.) AS 30. 31.; 2.看上面的语法感觉很浮云,不怕,这里带例子(继续使用 II 中用到的 PIVOT 表)-源表1. SELECT 2. 3. 班级总人数: AS 总人数 , 4. 5. 初一 1 班, 初一 2 班, 6. 7. 初二 1 班, 8. 9. 初三 1 班, 初三 2 班 10. 11.INTO #PivotTable -为了使表达意图更清晰,我把 PIVOT 处理后的表放到一个临时表当中 12. 13.FROM ( 14. 15.SELECT 16. 17.所属班级 AS 班级, 18. 19.学生编号 20. 21.FROM #Student 22. 23
16、.) AS SourceTable 24. 25.PIVOT ( 26. 27.COUNT(学生编号) 28. 29.FOR 班级 IN ( 30. 31.初一 1 班, 初一 2 班, 32. 33.初二 1 班, 34. 35.初三 1 班, 初三 2 班 36. 37.) 38. 39.) AS PivotTable 将多个列合并到单个列的转换的语句!-结果1. SELECT 2. 3. 班级, 总人数 4. 5. FROM ( 6. 7. SELECT 8. 9. 初一 1 班, 初一 2 班, 10. 11.初二 1 班, 12. 13.初三 1 班, 初三 2 班 14. 15.F
17、ROM 16. 17.#PivotTable 18. 19.) AS s 20. 21.UNPIVOT ( 22. 23.总人数 24. 25.FOR 班级 IN ( 26. 27.初一 1 班, 初一 2 班, 28. 29.初二 1 班, 30. 31.初三 1 班, 初三 2 班 32. 33.) 34. 35.) AS un_p 执行下面代码:1. SELECT 2. 3. 所属班级 AS 班级, 4. 5. 男 AS 男生人数, 6. 7. 女 AS 女生人数, 8. 9. 男 + 女 AS 总人数 10. 11.INTO #PivotTable2 -放到临时表方便查询 12. 13
18、.FROM ( 14. 15.SELECT 学生编号, 所属班级, 性别 FROM #Student 16. 17.) AS SourceTable 18. 19.PIVOT ( 20. 21.COUNT(学生编号) 22. 23.FOR 性别 IN ( 24. 25.男, 女 26. 27.) 28. 29.) AS PivotTable 30. 31.ORDER BY 总人数 DESC 32. 33.SELECT 34. 35.班级, 36. 37.男生或女生人数, 38. 39.性别, 40. 41.总人数 42. 43.FROM ( 44. 45.SELECT 班级, 男生人数, 女生
19、人数, 总人数 FROM #PivotTable2 46. 47.) AS s 48. 49.UNPIVOT ( 50. 51.男生或女生人数 52. 53.FOR 性别 IN ( 54. 55.男生人数, 56. 57.女生人数 58. 59.) 60. 61.) AS un_p 或者将性别和人数合并到一个列当中:1. SELECT 2. 3. 班级, 4. 5. 性别 + : + CAST(男生或女生人数 AS NVARCHAR(1) AS 男生或女生人数, 6. 7. 总人数 8. 9. FROM ( 10. 11.SELECT 班级, 男生人数, 女生人数, 总人数 FROM #PivotTable2 12. 13.) AS s 14. 15.UNPIVOT ( 16. 17.男生或女生人数 18. 19.FOR 性别 IN ( 20. 21.男生人数, 22. 23.女生人数 24. 25.) 26. 27.) AS un_p 关于 PIVOT 和 UNPIVOT 命令的使用就介绍到这里,如果想了解更多 SQL 的知识可以去看看这里的文章:http:/