sql的行转列(PIVOT)与列转行(UNPIVOT)
2016-11-06 22:31
411 查看
在做数据统计的时候,行转列,列转行是经常碰到的问题。case when方式太麻烦了,而且可扩展性不强,可以使用 PIVOT,UNPIVOT比较快速实现行转列,列转行,而且可扩展性强
一、行转列
1、测试数据准备
![](https://images2015.cnblogs.com/blog/852343/201611/852343-20161106221425580-97151040.png)
2、行转列sql
执行结果:
![](https://images2015.cnblogs.com/blog/852343/201611/852343-20161106222014080-1871458724.png)
二、列转行
1、测试数据准备
![](https://images2015.cnblogs.com/blog/852343/201611/852343-20161106222159799-624712374.png)
2、列转行的sql
执行结果:
一、行转列
1、测试数据准备
CREATE TABLE [StudentScores] ( [UserName] NVARCHAR(20), --学生姓名 [Subject] NVARCHAR(30), --科目 [Score] FLOAT, --成绩 ) INSERT INTO [StudentScores] SELECT '张三', '语文', 80 INSERT INTO [StudentScores] SELECT '张三', '数学', 90 INSERT INTO [StudentScores] SELECT '张三', '英语', 70 INSERT INTO [StudentScores] SELECT '张三', '生物', 85 INSERT INTO [StudentScores] SELECT '李四', '语文', 80 INSERT INTO [StudentScores] SELECT '李四', '数学', 92 INSERT INTO [StudentScores] SELECT '李四', '英语', 76 INSERT INTO [StudentScores] SELECT '李四', '生物', 88 INSERT INTO [StudentScores] SELECT '码农', '语文', 60 INSERT INTO [StudentScores] SELECT '码农', '数学', 82 INSERT INTO [StudentScores] SELECT '码农', '英语', 96 INSERT INTO [StudentScores] SELECT '码农', '生物', 78
![](https://images2015.cnblogs.com/blog/852343/201611/852343-20161106221425580-97151040.png)
2、行转列sql
SELECT * FROM [StudentScores] /*数据源*/ AS P PIVOT ( SUM(Score/*行转列后 列的值*/) FOR p.Subject/*需要行转列的列*/ IN ([语文],[数学],[英语],[生物]/*列的值*/) ) AS T
执行结果:
![](https://images2015.cnblogs.com/blog/852343/201611/852343-20161106222014080-1871458724.png)
二、列转行
1、测试数据准备
CREATE TABLE ProgrectDetail ( ProgrectName NVARCHAR(20), --工程名称 OverseaSupply INT, --海外供应商供给数量 NativeSupply INT, --国内供应商供给数量 SouthSupply INT, --南方供应商供给数量 NorthSupply INT --北方供应商供给数量 ) INSERT INTO ProgrectDetail SELECT 'A', 100, 200, 50, 50 UNION ALL SELECT 'B', 200, 300, 150, 150 UNION ALL SELECT 'C', 159, 400, 20, 320 UNION ALL
![](https://images2015.cnblogs.com/blog/852343/201611/852343-20161106222159799-624712374.png)
2、列转行的sql
SELECT P.ProgrectName,P.Supplier,P.SupplyNum FROM ( SELECT ProgrectName, OverseaSupply, NativeSupply, SouthSupply, NorthSupply FROM ProgrectDetail )T UNPIVOT ( SupplyNum FOR Supplier IN (OverseaSupply, NativeSupply, SouthSupply, NorthSupply ) ) P
执行结果:
![](https://images2015.cnblogs.com/blog/852343/201611/852343-20161106222326611-330127000.png)
相关文章推荐
- sql 行转列 PIVOT 列转行 UNPIVOT
- sql 行转列 PIVOT 列转行 UNPIVOT
- Oracle :数据库优化及 pivot(行转列) 和unpivot(列转行)
- T-Sql语法:行转列(pivot)和列转行(unpivot)
- PIVOT函数快速实现行转列,UNPIVOT实现列转行
- Oracle 行转列pivot 、列转行unpivot 的Sql语句总结
- SqlServer PIVOT函数快速实现行转列,UNPIVOT实现列转行
- 【原】SQL 使用 PIVOT 和 UNPIVOT 行转列 列转行
- Oracle 行转列pivot 、列转行unpivot 的Sql语句总结
- 经常用到的透视函数(行转列&列转行)函数 PIVOT()&UNPIVOT
- SQL中PIVOT 行转列和UNPIVOT列转行实例讲解
- SQL中Pivot和Unpivot
- sql 列转行(UNPIVOT)
- SQL中PIVOT 行列转换;UNPIVOT列转行
- T-SQL Part IX, PIVOT and UNPIVOT
- Give the New PIVOT and UNPIVOT Commands in SQL Server 2005 a Whirl
- SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
- T-SQL行列相互转换命令:PIVOT和UNPIVOT使用详解
- pivot(行转列)与unpivot(列转行)
- SQL pivot unpivot