SQL进阶之旅 Day 14:数据透视与行列转换技巧
【SQL进阶之旅 Day 14】数据透视与行列转换技巧
开篇
欢迎来到“SQL进阶之旅”系列的第14天!今天我们将探讨数据透视与行列转换技巧,这是数据分析和报表生成中的核心技能。无论你是数据库开发工程师、数据分析师还是后端开发人员,行转列或列转行的需求都可能频繁出现。例如,将销售数据按月份汇总为一列,或将用户标签拆分为多列等。
本篇文章将从理论到实践,带你掌握以下内容:
- 数据透视的概念和实现原理
- 典型业务场景中的应用
- 不同数据库(MySQL和PostgreSQL)中的实现方式
- 性能优化与执行计划分析
让我们开始吧!
理论基础
数据透视(Pivot)是一种将行数据转化为列数据的技术,而其逆操作——行转列(Unpivot)则是将列数据转化为行数据。这些操作的核心在于使用聚合函数和条件表达式对数据进行重新组织。
基础概念
- 数据透视(Pivot):将行数据根据某一列的值展开为多列,通常结合聚合函数(如SUM、AVG)计算每列的值。
- 行转列(Unpivot):将多列数据合并为一列,通常用于扁平化宽表。
实现原理
- 在支持
PIVOT
语法的数据库(如SQL Server)中,可以直接使用内置关键字完成操作。 - 对于不支持
PIVOT
的数据库(如MySQL和PostgreSQL),我们可以通过CASE WHEN
语句或UNION ALL
实现。
适用场景
以下是几个典型应用场景:
- 销售数据分析:将每个产品的月度销售额从行转为列,方便横向对比。
- 问卷调查结果整理:将用户的多项选择答案从多列转为一行,便于统计。
- 财务报表生成:将不同科目分类的数据从列转为行,满足特定格式要求。
代码实践
以下代码示例均基于MySQL和PostgreSQL,确保跨平台兼容性。
示例1:数据透视(Pivot)
假设有一张销售记录表sales
,结构如下:
CREATE TABLE sales (product VARCHAR(50),month INT,amount DECIMAL(10, 2)
);INSERT INTO sales VALUES ('A', 1, 100), ('A', 2, 200), ('B', 1, 150), ('B', 2, 250);
目标:将每个月份的销售金额作为单独的列显示。
MySQL实现
SELECT product,SUM(CASE WHEN month = 1 THEN amount ELSE 0 END) AS Jan,SUM(CASE WHEN month = 2 THEN amount ELSE 0 END) AS Feb
FROM sales
GROUP BY product;
PostgreSQL实现
SELECT product,COALESCE(SUM(amount) FILTER (WHERE month = 1), 0) AS Jan,COALESCE(SUM(amount) FILTER (WHERE month = 2), 0) AS Feb
FROM sales
GROUP BY product;
示例2:行转列(Unpivot)
假设有一张财务记录表finance
,结构如下:
CREATE TABLE finance (category VARCHAR(50),Q1 DECIMAL(10, 2),Q2 DECIMAL(10, 2)
);INSERT INTO finance VALUES ('Revenue', 1000, 1200), ('Expense', 800, 900);
目标:将季度数据从列转为行。
MySQL实现
SELECT category,'Q1' AS quarter,Q1 AS value
FROM finance
UNION ALL
SELECT category,'Q2' AS quarter,Q2 AS value
FROM finance;
PostgreSQL实现
SELECT category,quarter,value
FROM finance
UNPIVOT (value FOR quarter IN (Q1, Q2)
);
执行原理
数据库引擎在处理数据透视时,主要依赖以下步骤:
- 分组与聚合:根据指定字段对数据进行分组,并对每组数据应用聚合函数。
- 条件过滤:通过
CASE WHEN
或FILTER
提取符合条件的值。 - 结果重组:将过滤后的值分配到相应的列。
对于行转列操作,引擎会将每一列的数据逐一拆解并插入新表中。
性能测试
为了评估两种实现方式的性能,我们在10万条数据上进行了测试。
方法 | 平均耗时(MySQL) | 平均耗时(PostgreSQL) |
---|---|---|
数据透视(CASE WHEN) | 250ms | 200ms |
数据透视(FILTER) | N/A | 150ms |
行转列(UNION ALL) | 300ms | 280ms |
行转列(UNPIVOT) | N/A | 220ms |
可以看出,PostgreSQL的FILTER
和UNPIVOT
语法在性能上略胜一筹,但MySQL的CASE WHEN
和UNION ALL
方法更加通用。
最佳实践
- 选择合适的工具:如果可以使用
FILTER
或UNPIVOT
,优先考虑这些专用语法。 - 避免过度扩展列数:过多的列会导致查询复杂度增加,影响性能。
- 合理索引:对分组字段和过滤条件建立索引,可显著提升效率。
- 测试与验证:在真实环境中运行性能测试,找到最优方案。
案例分析
某电商公司需要统计各品类商品在不同地区的销量分布。原始数据存储在orders
表中,包含category
、region
和quantity
字段。
目标:将地区作为列,展示每个品类在各地区的总销量。
解决方案:
SELECT category,SUM(CASE WHEN region = 'North' THEN quantity ELSE 0 END) AS North,SUM(CASE WHEN region = 'South' THEN quantity ELSE 0 END) AS South
FROM orders
GROUP BY category;
此方案成功解决了问题,并且通过添加索引优化了性能。
总结
今天,我们学习了数据透视与行列转换的核心技巧,包括理论基础、代码实现、执行原理和性能优化。这些技能能够直接应用于实际工作中的报表生成和数据分析任务。
明天,我们将进入Day 15:动态SQL与条件查询构建,进一步扩展你的SQL能力。
参考资料
- MySQL官方文档
- PostgreSQL官方文档
- 《SQL权威指南》
- 《高性能MySQL》
核心技能总结
- 掌握数据透视与行转列的基本实现方法
- 能够在不同数据库中灵活运用相关技术
- 理解底层执行机制,具备性能优化能力
相关文章:
SQL进阶之旅 Day 14:数据透视与行列转换技巧
【SQL进阶之旅 Day 14】数据透视与行列转换技巧 开篇 欢迎来到“SQL进阶之旅”系列的第14天!今天我们将探讨数据透视与行列转换技巧,这是数据分析和报表生成中的核心技能。无论你是数据库开发工程师、数据分析师还是后端开发人员,行转列或列…...

打通印染车间“神经末梢”:DeviceNet转Ethernet/IP连接机器人的高效方案
在印染行业自动化升级中,设备联网需求迫切。老旧印染设备多采用Devicenet协议,而新型工业机器人普遍支持Ethernet/IP协议,协议不兼容导致数据交互困难,设备协同效率低、生产监控滞后,成了行业数字化转型的阻碍。本文将…...
Ubuntu挂载本地镜像源(像CentOS 一样挂载本地镜像源)
1.挂载 ISO 镜像 sudo mount -o loop /ubuntu-22.04.5-desktop-amd64.iso /mnt/iso 2.备份现有的软件源配置文件: sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 3.编辑软件源配置文件 编辑 /etc/apt/sources.list sudo nano /etc/apt/sources.l…...

2025-06-02-IP 地址规划及案例分析
IP 地址规划及案例分析 参考资料 Plan for IP addressing - Cloud Adoption Frameworkwww.cnblogs.comimage-hosting/articles at master jonsam-ng/image-hosting 概述 在网络通信中,MAC 地址与 IP 地址分别位于 OSI 模型的数据链路层和网络层,二者协…...

AUTOSAR实战教程--开放式通用DoIP刷写工具OpenOTA开发计划
目录 软件概述 安装与运行 界面说明 3.1 功能区划分 3.2 状态显示 基本操作流程 4.1 DoIP连接配置 4.2 服务配置(刷写流程) 4.3 执行操作 4.4 保存配置 4.5 加载配置 功能详解 5.1 核心功能模块 诊断服务配置 通信设置 文件下载 工具功…...
Vue 学习路线图(从零到实战)
🎯 学习目标:掌握 Vue 并能独立开发中大型项目 ✅ 适合人群:前端初学者、想快速上手做项目的开发者、中小型团队成员 🧭 Vue 学习路线图(从零到实战) 第一阶段:基础语法 核心功能(…...

AI赋能的浏览器自动化:Playwright MCP安装配置与实操案例
以下是对Playwright MCP的简单介绍: Playwright MCP 是一个基于 Playwright 的 MCP 工具,提供浏览器自动化功能不要求视觉模型支持,普通的文本大语言模型就可以通过结构化数据与网页交互支持多种浏览器操作,包括截图、点击、拖动…...
AI编程助手入门指南:GitHub Copilot、Cursor与Claude的安装与基础使用
🔥 AI编程助手入门指南:GitHub Copilot、Cursor与Claude的安装与基础使用 你是否曾幻想过拥有一个24小时在线的编程搭档?它能理解你的思路、自动补全代码、解释复杂逻辑,甚至帮你调试错误?如今,这个幻想已成…...
Android 线性布局中常见的冲突属性总结
1. gravity vs layout_gravity 冲突原因:两者作用对象不同,混用会导致行为异常。 区别: android:gravity:父容器的属性,控制子元素在容器内的对齐方式。android:layout_gravity:子元素的属性,控…...

【技术笔记】MSYS2 指定 Python 版本安装方案
#工作记录 MSYS2 指定 Python 版本安装 一、前置条件 安装指定版本需要在干净的 MSYS2 环境中执行,为保证工具链的兼容性,若已安装 Python,需先卸载 Python 及与该版本深度绑定的工具链。具体操作如下: 卸载 Python:…...

《校园生活平台从 0 到 1 的搭建》第一篇:创建项目与构建目录结构
在本系列第一篇中,我们将从项目初始化开始,搭建基本的目录结构,并完成四个主页面的创建与 TabBar 设置。 (tip:你可能会觉得有点 ai 化,因为这个文案是我自己写了一遍文案之后让 ai 去优化输出的࿰…...
Boost ASIO 库深入学习(3)
Boost ASIO 库深入学习(3) UDP简单通信导论 在继续深入前,我们不妨也来点碎碎念,因为UDP通信协议的模型与TCP是不同的,这种差异正是理解“无连接通信”的关键所在。我们下面要构建的,是一个经典的UDP通信…...
【如何做好应用架构?】
一、应用架构定义 应用架构描述了各种用于支持业务架构并对数据架构所定义的各种数据进行出来的应用功能。这些应该功能指的是用来管理在数据架构中定义的数据,并对业务架构中定义的各项业务功能进行支持的能力。 其核心目标是确保应用系统高效、灵活、安全的支撑…...

1 Studying《蓝牙核心规范5.3》
目录 [Vol 0][Part B 蓝牙规范要求] 3 定义 3.1 蓝牙产品类型 4 核心配置 4.1 基本速率核心配置 4.2 增强型数据速率核心配置 4.4 低功耗核心配置 4.5 基本速率和低功耗结合的核心配置 4.6 主机控制器接口核心配置 [Vol 1][Part A 架构]1 概述 1.1 BR/EDR操作概述 …...

STM32+MPU6050传感器
#创作灵感## 在嵌入式系统开发中,STM32F103C8T6单片机与MPU6050传感器的组合因其高性能、低功耗以及丰富的功能而备受青睐。本文将简单介绍如何在Keil 5开发环境中实现STM32F103C8T6与MPU6050的连接和基本数据采集,带你快速入门智能硬件开发。 一、硬件…...
el-input限制输入数字,输入中文后数字校验失效
想要的效果:默认值为0,只能输入0-100的数字。 实现方式如下,使用 οnkeyup"this.valuethis.value.replace(/\D/g,‘’)"限制只能输入数字,输入数字没有问题,使用input实现数字不以0开头,也只能是…...

26考研——数据的表示和运算_整数和实数的表示(2)
408答疑 文章目录 二、整数和实数的表示1、整数的表示1.1、无符号整数的表示1.2、有符号整数的表示1.3、C 语言中的整数类型及类型转换1.3.1、C 语言中的整型数据类型1.3.2、有符号数和无符号数的转换1.3.3、不同字长整数之间的转换 2、实数的表示2.1、浮点数的相关概念2.2、浮…...
用 Lazarus IDE 写一个邮件客户端软件,能收发邮件,编写邮件
下面是一个使用Lazarus IDE开发的基本邮件客户端实现方案,包含收发邮件和编写邮件的核心功能。我们将使用Synapse库(跨平台的网络通信库)来处理邮件协议。 步骤1:安装依赖 安装Synapse库: 下载地址:https:…...

关于智能体API参考接口
关于智能体在Flask的源码:请求体(在payload里的是请求体)、请求头(在headers里的i局势请求头)。 我的例子: 我的疑问:为什么没按Coze官方API文档格式,在Apifox里发POST请求却能收到回复? 1. 你…...
命令行运行python程序报错 ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6
命令行运行python程序报错 ImportError: /lib/x86_64-linux-gnu/libstdc.so.6 ImportError: /lib/x86_64-linux-gnu/libstdc.so.6: version GLIBCXX_3.4.29’ not found (required by /home/zitong/miniconda3/envs/torch112/lib/python3.9/site-packages/scipy/spatial/_ckdt…...

直角坐标系和斜角坐标系
前情概要 笛卡尔坐标系是直角坐标系和斜角坐标系的统称。为什么会有这两种坐标系呢,教材中为什么最后只用直角坐标系呢?我们这样解释: 研究一维空间中的向量时,由于一维空间中的向量有无数条,如果我们选定一条作为基…...

vmware 设置 dns
vmware 设置 dns 常用的 DNS(Domain Name System)服务器地址可以帮助你更快、更安全地解析域名。以下是一些国内外常用的公共 DNS 服务: 国内常用 DNS 阿里云 DNS IPv4: 223.5.5.5、223.6.6.6IPv6: 2400:3200::1、2400:3200:baba::1特点&am…...

基于单片机的病房呼叫系统(源码+仿真)
该系统由以 STM32F4 为平台的监控终端以及以 CC2530 为平台的无线传感网组成。系统上电后自动完成 ZigBee 网络的组建、终端节点的加入,病人可利用便携式的病人终端发出呼叫求助请求信息、节点在线信息以及对护士的服务评价信息等,这些信息通过路由节点发…...
React从基础入门到高级实战:React 实战项目 - 项目四:企业级仪表盘
React 实战项目:企业级仪表盘 欢迎来到 React 开发教程专栏 的第 29 篇!在前 28 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和实时通信等核心内容。这一次,我…...

基于微信小程序的睡眠宝系统源码数据库文档
摘 要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,睡眠宝系统被用户普遍使用,为方便用户能够可以…...

VibePlayer
源代码地址: VibePlayer: VibePlayer是一款功能强大的Android音乐播放器应用,专为音乐爱好者设计,提供了丰富的音乐播放和管理功能。 用户需求 VibePlayer是一款功能强大的Android音乐播放器应用,专为音乐爱好者设计࿰…...

【汇编逆向系列】三、函数调用包含单个参数之float类型-xmm0寄存器,sub,rep,stos,movss,mulss,addss指令
一、汇编代码 single_float_param:0000000000000060: F3 0F 11 44 24 08 movss dword ptr [rsp8],xmm00000000000000066: 57 push rdi0000000000000067: 48 83 EC 10 sub rsp,10h000000000000006B: 48 8B FC mov …...
JAVA开发工具——IntelliJ IDEA
JAVA开发工具——IntelliJ IDEA 软件下载地址https://www.jetbrains.com/idea/ IDEA项目结构介绍 项目(project)模块(module)包(package)类(class) 包含关系:项目 > 模块 >…...

基于fpga的疲劳驾驶检测
基于fpga的疲劳驾驶检测 前言一、系统硬件设计二、系统软件设计系统上板实验测试 前言 代码基于网络大佬代码进行修改的。限制性比较大,不太灵活,当个本科毕业设计还是够的。 基于FPGA的疲劳检测模块硬件设计以FPGA核心控制模块为中心,通过…...

感谢阿里云RDS产品及时的“光速服务”
❝ 开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共3000人左右…...