深入浅出: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 通过逆向操作恢复数据结构,适合数据清洗
- 二者配合使用可完成复杂数据转换需求
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。