深入浅出:SQL Server 中的 PIVOT 与 UNPIVOT 用法详解

06-01 1036阅读

深入浅出: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 别名;

实战示例

场景:统计各部门在不同季度的销售额。

  1. 准备数据
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);
  1. 执行 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;

输出结果:

深入浅出:SQL Server 中的 PIVOT 与 UNPIVOT 用法详解

二、UNPIVOT:将列转换为行

UNPIVOT函数,它的作用和PIVOT相反,是用来把数据从列转换回行。比如,在PIVOT之后得到的一张表格里,如果需要进一步细分数据或者进行其他操作,可以用UNPIVOT来恢复原来的多行结构。

核心作用

将多列合并为两列(属性名+属性值),实现数据逆向透视。

语法结构

SELECT [非透视列], [属性列], [值列]
FROM 表
UNPIVOT (
    值列 FOR 属性列 IN ([列1], [列2], ...)
) AS 别名;

实战示例

场景:将季度销售额列还原为行结构。

  1. 使用之前 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);
  1. 执行 UNPIVOT
SELECT Department, Quarter, Amount
FROM #PivotedSales
UNPIVOT (
    Amount FOR Quarter IN (Q1, Q2, Q3, Q4)
) AS Unpvt;

输出结果:

深入浅出:SQL Server 中的 PIVOT 与 UNPIVOT 用法详解

三、关键注意事项

  1. 数据类型一致性

    UNPIVOT 的所有列必须具有兼容的数据类型。

  2. 处理 NULL 值

    PIVOT 会自动过滤 NULL 值,可通过 ISNULL() 或 COALESCE() 预处理。

  3. 动态列处理

    当透视列值不固定时,需使用动态 SQL 拼接列名(示例需另写代码实现)。

  4. 性能优化

    对大型数据集建议建立合适索引,避免全表扫描。

四、典型应用场景对比

操作适用场景示例
PIVOT生成交叉报表、统计类报表部门季度销售汇总
UNPIVOT数据规范化、ETL预处理、存储优化将多个月份列合并为日期维度

五、总结

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

目录[+]

取消
微信二维码
微信二维码
支付宝二维码