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

2025-05-18 02:50

本文主要是介绍SQL Server中的PIVOT与UNPIVOT用法具体示例详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《SQLServer中的PIVOT与UNPIVOT用法具体示例详解》这篇文章主要给大家介绍了关于SQLServer中的PIVOT与UNPIVOT用法的具体示例,SQLServer中PIVOT和U...

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

引言

在数据分析与报表生成场景中,行列转换是一个高频需求。SQL Server 提供了 PIVOT 和 UNPIVOT 两个强大的运算符,能够帮助我们快速实现数据透视与逆透视操作。本文将结合具体示例,解析它们的核心用法。

一、PIVOT:将行转换为列

PIVOT函数主要是用来将数据从行转换成列。比如,如果有订单数据表,里面有很多订单的信息,可能按客户ID、订单日期等分组。使用PIVOT可以把这些重复的客户信息排列成一个更紧凑的表格,每个客户的订单日期变成一列,这样看起来更直观。

核心作用

将某一列的唯一值作为新列名,并按需聚合关联数据。

语法结构

SELECT [非透视列], [透视列1], [透视列2], ...
FROM (
    SELEChina编程CT [列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;

输出结果

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

二、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编程China编程),
    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;

输出结果

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

三、关键注意事项

  • 数据类型一致性UNPIVOT 的所有列必须具有兼容的数据类型。

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

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

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

四、典型应用场景对比

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

五、总结

  • PIVOT 通过聚合实现行转列,适合制作汇总视图
  • UNPIVOT 通过逆向操作恢复数据结构,适合数据清洗
  • 二者配合使用可完成复杂数据转换需求

到此这篇关于SQL Server中的PIVandroidOT与UNPIVOT用法具体示例的文章就介绍到这www.chinasem.cn了,更多相关SQLServer PIVOT与UNPIVOT用法内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于SQL Server中的PIVOT与UNPIVOT用法具体示例详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154639

相关文章

Nginx路由匹配规则及优先级详解

《Nginx路由匹配规则及优先级详解》Nginx作为一个高性能的Web服务器和反向代理服务器,广泛用于负载均衡、请求转发等场景,在配置Nginx时,路由匹配规则是非常重要的概念,本文将详细介绍Ngin... 目录引言一、 Nginx的路由匹配规则概述二、 Nginx的路由匹配规则类型2.1 精确匹配(=)2

一文详解如何查看本地MySQL的安装路径

《一文详解如何查看本地MySQL的安装路径》本地安装MySQL对于初学者或者开发人员来说是一项基础技能,但在安装过程中可能会遇到各种问题,:本文主要介绍如何查看本地MySQL安装路径的相关资料,需... 目录1. 如何查看本地mysql的安装路径1.1. 方法1:通过查询本地服务1.2. 方法2:通过MyS

Mysql数据库中数据的操作CRUD详解

《Mysql数据库中数据的操作CRUD详解》:本文主要介绍Mysql数据库中数据的操作(CRUD),详细描述对Mysql数据库中数据的操作(CRUD),包括插入、修改、删除数据,还有查询数据,包括... 目录一、插入数据(insert)1.插入数据的语法2.注意事项二、修改数据(update)1.语法2.有

Python logging模块使用示例详解

《Pythonlogging模块使用示例详解》Python的logging模块是一个灵活且强大的日志记录工具,广泛应用于应用程序的调试、运行监控和问题排查,下面给大家介绍Pythonlogging模... 目录一、为什么使用 logging 模块?二、核心组件三、日志级别四、基本使用步骤五、快速配置(bas

SQL 外键Foreign Key全解析

《SQL外键ForeignKey全解析》外键是数据库表中的一列(或一组列),用于​​建立两个表之间的关联关系​​,外键的值必须匹配另一个表的主键(PrimaryKey)或唯一约束(UniqueCo... 目录1. 什么是外键?​​ ​​​​2. 外键的语法​​​​3. 外键的约束行为​​​​4. 多列外键​

C#特性(Attributes)和反射(Reflection)详解

《C#特性(Attributes)和反射(Reflection)详解》:本文主要介绍C#特性(Attributes)和反射(Reflection),具有很好的参考价值,希望对大家有所帮助,如有错误... 目录特性特性的定义概念目的反射定义概念目的反射的主要功能包括使用反射的基本步骤特性和反射的关系总结特性

详解如何在SpringBoot控制器中处理用户数据

《详解如何在SpringBoot控制器中处理用户数据》在SpringBoot应用开发中,控制器(Controller)扮演着至关重要的角色,它负责接收用户请求、处理数据并返回响应,本文将深入浅出地讲解... 目录一、获取请求参数1.1 获取查询参数1.2 获取路径参数二、处理表单提交2.1 处理表单数据三、

PyQt6中QMainWindow组件的使用详解

《PyQt6中QMainWindow组件的使用详解》QMainWindow是PyQt6中用于构建桌面应用程序的基础组件,本文主要介绍了PyQt6中QMainWindow组件的使用,具有一定的参考价值,... 目录1. QMainWindow 组php件概述2. 使用 QMainWindow3. QMainW

MySQL精准控制Binlog日志数量的三种方案

《MySQL精准控制Binlog日志数量的三种方案》作为数据库管理员,你是否经常为服务器磁盘爆满而抓狂?Binlog就像数据库的“黑匣子”,默默记录着每一次数据变动,但若放任不管,几天内这些日志文件就... 目录 一招修改配置文件:永久生效的控制术1.定位my.cnf文件2.添加核心参数不重启热更新:高手应

MySQL中SQL的执行顺序详解

《MySQL中SQL的执行顺序详解》:本文主要介绍MySQL中SQL的执行顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql中SQL的执行顺序SQL执行顺序MySQL的执行顺序SELECT语句定义SELECT语句执行顺序总结MySQL中SQL的执行顺序