SQL的行转列(PIVOT)与列转行(UNPIVOT)

/*测试环境:

SQL Server Management Studio 15.0.18075.0
Microsoft Analysis Services 客户端工具 15.0.1200.20
Microsoft 数据访问组件 (MDAC) 10.0.14393.0
Microsoft MSXML 3.0 6.0
Microsoft Internet Explorer 9.11.14393.0
Microsoft .NET Framework 4.0.30319.42000
操作系统 6.3.14393

*/

在做数据统计的时候,行转列,列转行是经常碰到的问题。

CASE WHEN方式太麻烦了,而且可扩展性不强,可以使用 PIVOT,UNPIVOT比较快速实现行转列,列转行,而且可扩展性强。

一、行转列

1、测试数据准备

 1 CREATE  TABLE [StudentScores]
 2 (
 3    [UserName]         NVARCHAR(20),        --学生姓名
 4    [Subject]          NVARCHAR(30),        --科目
 5    [Score]            FLOAT,               --成绩
 6 )
 7 
 8 INSERT INTO [StudentScores] SELECT '张三', '语文', 80
 9 INSERT INTO [StudentScores] SELECT '张三', '数学', 90
10 INSERT INTO [StudentScores] SELECT '张三', '英语', 70
11 INSERT INTO [StudentScores] SELECT '张三', '生物', 85
12 INSERT INTO [StudentScores] SELECT '李四', '语文', 80
13 INSERT INTO [StudentScores] SELECT '李四', '数学', 92
14 INSERT INTO [StudentScores] SELECT '李四', '英语', 76
15 INSERT INTO [StudentScores] SELECT '李四', '生物', 88
16 INSERT INTO [StudentScores] SELECT '码农', '语文', 60
17 INSERT INTO [StudentScores] SELECT '码农', '数学', 82
18 INSERT INTO [StudentScores] SELECT '码农', '英语', 96
19 INSERT INTO [StudentScores] SELECT '码农', '生物', 78

 

2、行转列SQL

1 SELECT * FROM [StudentScores] /*数据源*/
2 AS P
3 PIVOT 
4 (
5     SUM(Score/*行转列后 列的值*/) FOR 
6     p.Subject/*需要行转列的列*/ IN ([语文],[数学],[英语],[生物]/*列的值*/)
7 ) AS T

 

执行结果:

二、列转行

1、测试数据准备

 1 CREATE TABLE ProgrectDetail
 2 (
 3     ProgrectName         NVARCHAR(20), --工程名称
 4     OverseaSupply        INT,          --海外供应商供给数量
 5     NativeSupply         INT,          --国内供应商供给数量
 6     SouthSupply          INT,          --南方供应商供给数量
 7     NorthSupply          INT           --北方供应商供给数量
 8 )
 9 
10 INSERT INTO ProgrectDetail
11 SELECT 'A', 100, 200, 50, 50
12 UNION ALL
13 SELECT 'B', 200, 300, 150, 150
14 UNION ALL
15 SELECT 'C', 159, 400, 20, 320
16 UNION ALL
17 SELECT 'D', 250, 30, 15, 15

 

2、列转行的SQL

 1 SELECT P.ProgrectName,P.Supplier,P.SupplyNum
 2 FROM 
 3 (
 4     SELECT ProgrectName, OverseaSupply, NativeSupply,
 5            SouthSupply, NorthSupply
 6      FROM ProgrectDetail
 7 )T
 8 UNPIVOT 
 9 (
10     SupplyNum FOR Supplier IN
11     (OverseaSupply, NativeSupply, SouthSupply, NorthSupply )
12 ) P

 

执行结果:

posted @ 2019-04-04 14:26  ittalk  阅读(111)  评论(0)    收藏  举报