SQL Server中的PIVOT与UNPIVOT用法具体示例详解

引言
在数据分析与报表生成场景中,行列转换是一个高频需求。SQL Server 提供了 PIVOT 和 UNPIVOT 两个强大的运算符,能够帮助我们快速实现数据透视与逆透视操作。本文将结合具体示例,解析它们的核心用法。
一、PIVOT:将行转换为列
PIVOT函数主要是用来将数据从行转换成列。比如,如果有订单数据表,里面有很多订单的信息,可能按客户ID、订单日期等分组。使用PIVOT可以把这些重复的客户信息排列成一个更紧凑的表格,每个客户的订单日期变成一列,这样看起来更直观。
核心作用
将某一列的唯一值作为新列名,并按需聚合关联数据。
语法结构
SELECT [非透视列], [透视列1], [透视列2], ...
FROM (
SELECT [列1], [列2], [聚合列]
FROM 表
) AS 源表
PIVOT (
聚合函数(聚合列)
FOR [目标列] IN ([透视值1], [透视值2], ...)
) AS 别名;
实战示例
场景:统计各部门在不同季度的销售额。
- 准备数据
CREATE TABLE #Sales (
Department VARCHAR(50),
Quarter CHAR(2),
Amount DECIMAL(10,2)
);
INSERT INTO #Sales VALUES
('HR', 'Q1', 20000),
('HR', 'Q2', 22000),
('IT', 'Q1', 35000),
('IT', 'Q3', 41000);
- 执行 PIVOT
SELECT Department, [Q1], [Q2], [Q3], [Q4]
FROM (
SELECT Department, Quarter, Amount
FROM #Sales
) AS Src
PIVOT (
SUM(Amount)
FOR Quarter IN ([Q1], [Q2], [Q3], [Q4])
) AS Pvt;
输出结果:

二、UNPIVOT:将列转换为行
UNPIVOT函数,它的作用和PIVOT相反,是用来把数据从列转换回行。比如,在PIVOT之后得到的一张表格里,如果需要进一步细分数据或者进行其他操作,可以用UNPIVOT来恢复原来的多行结构。
核心作用
将多列合并为两列(属性名+属性值),实现数据逆向透视。
语法结构
SELECT [非透视列], [属性列], [值列]
FROM 表
UNPIVOT (
值列 FOR 属性列 IN ([列1], [列2], ...)
) AS 别名;
实战示例
场景:将季度销售额列还原为行结构。
- 使用之前 PIVOT 的结果作为输入
CREATE TABLE #PivotedSales (
Department VARCHAR(50),
Q1 DECIMAL(10,2),
Q2 DECIMAL(10,2),
Q3 DECIMAL(10,2),
Q4 DECIMAL(10,2)
);
INSERT INTO #PivotedSales VALUES
('HR', 20000, 22000, NULL, NULL),
('IT', 35000, NULL, 41000, NULL);
- 执行 UNPIVOT
SELECT Department, Quarter, Amount
FROM #PivotedSales
UNPIVOT (
Amount FOR Quarter IN (Q1, Q2, Q3, Q4)
) AS Unpvt;
输出结果:

三、关键注意事项
数据类型一致性UNPIVOT 的所有列必须具有兼容的数据类型。
处理 NULL 值PIVOT 会自动过滤 NULL 值,可通过
ISNULL()或COALESCE()预处理。动态列处理当透视列值不固定时,需使用动态 SQL 拼接列名(示例需另写代码实现)。
性能优化对大型数据集建议建立合适索引,避免全表扫描。
四、典型应用场景对比
| 操作 | 适用场景 | 示例 |
|---|---|---|
| PIVOT | 生成交叉报表、统计类报表 | 部门季度销售汇总 |
| UNPIVOT | 数据规范化、ETL预处理、存储优化 | 将多个月份列合并为日期维度 |
五、总结
- PIVOT 通过聚合实现行转列,适合制作汇总视图
- UNPIVOT 通过逆向操作恢复数据结构,适合数据清洗
- 二者配合使用可完成复杂数据转换需求
到此这篇关于SQL Server中的PIVOT与UNPIVOT用法具体示例的文章就介绍到这了,更多相关SQLServer PIVOT与UNPIVOT用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SQL Server中修改“用户自定义表类型”问题的分析与方法
这篇文章主要给大家介绍了关于SQL Server中修改“用户自定义表类型”问题的分析与方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。2017-09-09
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
这篇文章介绍了SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-05-05
sqlserver bcp(数据导入导出工具)一般用法与命令详解
bcp是SQL Server中负责导入导出数据的一个命令行工具,它是基于DB-Library的,并且能以并行的方式高效地导入导出大批量的数据2012-07-07
SQL中WHERE变量IS NULL条件导致全表扫描问题的解决方法
今天在评审接手的项目中的存储过程时,发现存在大量的在条件里判断变量是否NULL的写法2013-09-09


最新评论