前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >行转列不再复杂:SQL高手都在用的技巧揭秘

行转列不再复杂:SQL高手都在用的技巧揭秘

作者头像
wayn
发布于 2025-04-04 12:04:11
发布于 2025-04-04 12:04:11
10500
代码可运行
举报
文章被收录于专栏:wayn的程序开发wayn的程序开发
运行总次数:0
代码可运行

在数据世界中,数据的“形状”往往决定分析的效率。例如:

  • 原始数据:季度销售额按行排列,难以直接生成年度对比报表。
  • 目标:将季度(Q1-Q4)转换为列,直观展示全年趋势。

这就是行转列(Pivot)的核心价值——将冗长的纵向数据“压缩”为横向结构,让分析更高效。本文将通过实战案例,手把手教你掌握 SQL 中行转列的3 种核心方法,并揭示高手的隐藏技巧

一、行转列原理:从行到列的数学逻辑

问题场景: 假设有一张销售表 sales

year

quarter

revenue

2023

Q1

5000

2023

Q2

7000

2023

Q3

6000

2023

Q4

8000

目标: 将季度(Q1-Q4)转换为列,输出:

year

Q1

Q2

Q3

Q4

2023

5000

7000

6000

8000

核心逻辑

  1. 分组聚合:按年份分组,计算每个季度的销售额。
  2. 列名固定:将季度值(Q1-Q4)作为新列名。
  3. 条件判断:通过条件表达式(如CASE WHEN)将行数据映射到对应列。

前置 SQL:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE`sales`  (
`year`varchar(255) CHARACTERSET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULLDEFAULTNULL,
`quarter`varchar(255) CHARACTERSET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULLDEFAULTNULL,
`revenue`varchar(255) CHARACTERSET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULLDEFAULTNULL
) ENGINE = InnoDBCHARACTERSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;


INSERTINTO`sales`VALUES ('2023', 'Q2', '7000');
INSERTINTO`sales`VALUES ('2023', 'Q3', '6000');
INSERTINTO`sales`VALUES ('2023', 'Q4', '8000');
INSERTINTO`sales`VALUES ('2023', 'Q1', '5000');

二、方法详解:3 种行转列实战技巧

方法 1:经典 CASE WHEN(通用版)

适用场景:所有 SQL 数据库MySQLPostgreSQLSQL Server 等)。 代码示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT
  year,
SUM(CASEWHENquarter = 'Q1'THEN revenue ELSE0END) AS Q1,
SUM(CASEWHENquarter = 'Q2'THEN revenue ELSE0END) AS Q2,
SUM(CASEWHENquarter = 'Q3'THEN revenue ELSE0END) AS Q3,
SUM(CASEWHENquarter = 'Q4'THEN revenue ELSE0END) AS Q4
FROM sales
GROUPBYyear;

关键点

  • CASE WHEN:为每个季度创建条件判断,将符合条件的值汇总到对应列。
  • SUM():聚合非目标季度的值为 0,确保结果仅包含目标列的值。
  • GROUP BY:按年份分组,生成每行的年度汇总。

优势

  • 兼容性:所有 SQL 数据库支持。
  • 可控性:可灵活调整列名和聚合方式(如MAX()AVG())。

方法 2:PIVOT 语句(简洁版)

适用场景:SQL Server、Oracle、Snowflake 等支持PIVOT的数据库。 代码示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT *
FROM sales
PIVOT (
  SUM(revenue)
  FOR quarter IN ('Q1', 'Q2', 'Q3', 'Q4')
) AS pivot_table;

关键点

  • PIVOT:直接指定要转换的列(quarter)和目标列值(Q1-Q4)。
  • 自动聚合SUM()会自动对每个季度的revenue求和。

优势

  • 简洁性:代码行数减少 60%。
  • 可读性:逻辑更直观。

局限性

  • 不支持动态列:列名必须预先定义(如 Q1-Q4)。
  • 兼容性:部分数据库(如 MySQL)不支持PIVOT

方法 3:动态列生成(进阶版)

适用场景:列名未知或动态变化(如 quarter )。 实现思路

  1. 获取所有唯一列值:从数据中提取可能的列名。
  2. 动态生成 SQL 语句:通过应用程序或存储过程拼接CASE WHEN条件。

示例(MySql)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 1. 获取所有列名
SET @cols = NULL;
SELECTGROUP_CONCAT(DISTINCTCONCAT('SUM(CASE WHEN quarter = ''', quarter, ''' THEN revenue END) AS ', quarter))
INTO @cols
FROM sales;

-- 2. 拼接完整SQL语句
SET @sql = CONCAT(
'SELECT year, ', @cols,
' FROM sales
   GROUP BY year'
);

-- 3. 执行动态SQL
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATEPREPARE stmt;

优势

  • 动态适应:列名无需硬编码,适合未知或变化的列。

三、实战案例:复杂场景下的行转列

案例 1:多维度聚合(年+季度+产品)

需求:按年份和产品类型,统计各季度销售额。 原始数据

year

product

quarter

revenue

2023

A

Q1

3000

2023

A

Q2

4000

2023

B

Q1

2000

2023

B

Q2

3000

SQL 代码(CASE WHEN)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT
  year,
  product,
SUM(CASEWHENquarter = 'Q1'THEN revenue ELSE0END) AS Q1,
SUM(CASEWHENquarter = 'Q2'THEN revenue ELSE0END) AS Q2
FROM sales
GROUPBYyear, product;

输出

year

product

Q1

Q2

2023

A

3000

4000

2023

B

2000

3000


案例 2:非数值型数据转列

需求:统计不同地区的用户注册渠道(渠道为文本列)。 原始数据

region

channel

count

北京

线上

150

北京

线下

100

上海

线上

200

SQL 代码(PIVOT)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT region, [线上], [线下]
FROM (
  SELECT region, channel, count
  FROM user_registration
) AS src
PIVOT (
  SUM(count)
  FOR channel IN ([线上], [线下])
) AS pvt;

输出

region

线上

线下

北京

150

100

上海

200

NULL

四、性能优化与常见问题

1. 性能优化技巧

  • 索引优化:在quarteryear等分组列上建立索引。
  • 避免全表扫描:使用WHERE子句过滤无关数据。
  • 列数控制:减少转列的数量(如仅转 Q1-Q4,而非所有月份)。

2. 常见问题解决

NULL 值处理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 替换NULL0
COALESCE(SUM(...), 0) AS column_name

列名冲突: 使用AS关键字重命名列(如AS [Q1_Sales])。

五、进阶技巧

结合窗口函数

在转列前,先通过窗口函数计算累计值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT
  year,
SUM(CASEWHENquarter = 'Q1'THEN revenue END) AS Q1,
SUM(CASEWHENquarter = 'Q2'THEN revenue END) AS Q2,
SUM(CASEWHENquarter = 'Q3'THEN revenue END) AS Q3,
SUM(CASEWHENquarter = 'Q4'THEN revenue END) AS Q4,
-- 计算累计值
SUM(revenue) OVER (PARTITIONBYyearORDERBYquarter) AS cumulative
FROM sales
GROUPBYyear, quarter;

总结

方法

适用场景

代码复杂度

兼容性

CASE WHEN

全平台通用,动态列适配

所有数据库

PIVOT

简洁高效,列名固定

SQL Server 等

动态 SQL 生成

列名未知或动态变化

需程序支持

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 waynblog 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
WHEN NOT TO USE DEEP LEARNING
转载自: http://hyperparameter.space/blog/when-not-to-use-deep-learning/
GavinZhou
2019/05/26
5620
BERT 是如何构建模型的
前面我写了一篇文章来讲 BERT 是如何分词的,现在,轮到该说说 BERT 模型是如何定义的了。
Alan Lee
2020/06/24
2.5K0
BERT 是如何构建模型的
BERT模型解析
Bidirectional Encoder Representation from Transformers(BERT)[1],即双向Transformer的Encoder表示,是2018年提出的一种基于上下文的预训练模型,通过大量语料学习到每个词的一般性embedding形式,学习到与上下文无关的语义向量表示,以此实现对多义词的建模。与预训练语言模型ELMo[2]以及GPT[3]的关系如下图所示:
felixzhao
2022/09/27
2.2K0
BERT模型解析
Emojify_v2a
Welcome to the second assignment of Week 2. You are going to use word vector representations to build an Emojifier.
列夫托尔斯昊
2020/08/25
1.5K0
Emojify_v2a
AlexNet论文总结
本文介绍了深度卷积神经网络在图像分类任务上的挑战、解决方案和实验结果。首先,文章介绍了在自然语言描述场景下,针对图像分类任务的数据集和评估方法。然后,文章详细阐述了使用深度卷积神经网络在图像分类任务上的挑战,包括训练数据不充足、训练时间过长、模型过拟合等问题。接着,文章介绍了解决这些问题的方法,包括使用更大的数据集进行训练、使用更快的优化算法、使用正则化方法、数据增强、Dropout等。最后,文章给出了实验结果,展示了使用深度卷积神经网络在图像分类任务上的表现。
Tyan
2017/12/28
1.1K0
AlexNet论文总结
通用人工智能技术之'注意力':Top-down Neural Attention ppt论文翻译及代码
注意力是生物视觉思考等很重要的机制之一,这篇论文给出了更加接近生物注意机制的实现 我们首先给出论文12页ppt,接着是论文对译 ppt: 论文解读如下: abstract aim to model t
CreateAMind
2018/07/20
8680
45测试深度学习基础知识的数据科学家的问题(以及解决方案)
原文:https://www.analyticsvidhya.com/blog/2017/01/must-know-questions-deep-learning/ 介绍 早在2009年,深度学习只是一个新兴领域。 只有少数人认为它是一个富有成果的研究领域。 今天,它被用于开发一些被认为是难以做到的事情的应用程序。 语音识别,图像识别,数据集中的查找模式,照片中的对象分类,字符文本生成,自驾车等等只是几个例子。 因此,熟悉深度学习及其概念很重要。 在这次技能测试中,我们测试了我们的社区关于深度学习的基本概念
架构师研究会
2018/04/09
6820
45测试深度学习基础知识的数据科学家的问题(以及解决方案)
ImageNet Classification with Deep Convolutional Neural Networks——AlexNet论文翻译——中英文对照
本文介绍了视觉图像在计算机视觉领域的应用和进展。从图像分类、目标检测和图像分割等任务入手,介绍了目前最先进的算法和技术,包括基于深度学习的方法、卷积神经网络、图像分割的深度学习方法等。同时,也探讨了这些方法在实际应用中的效果和挑战。
Tyan
2017/12/29
1K0
ImageNet Classification with Deep Convolutional Neural Networks——AlexNet论文翻译——中英文对照
Build Residual Networks
我们将使用残差网络建立一个很深的卷积神经网络,理论上而言越深的网络可以表示更加复杂的函数,但是训练也更加困难。Residual Networks可以让我们训练更深的网络。
小飞侠xp
2018/08/29
1.1K0
Building deep retrieval models
In the featurization tutorial we incorporated multiple features into our models, but the models consist of only an embedding layer. We can add more dense layers to our models to increase their expressive power. In general, deeper models are capable of learning more complex patterns than shallower models. For example, our user model incorporates user ids and timestamps to model user preferences at a point in time. A shallow model (say, a single embedding layer) may only be able to learn the simplest relationships between those features and movies: a given movie is most popular around the time of its release, and a given user generally prefers horror movies to comedies. To capture more complex relationships, such as user preferences evolving over time, we may need a deeper model with multiple stacked dense layers.
XianxinMao
2021/07/30
3520
Text classification with TensorFlow Hub: Movie reviews
This notebook classifies movie reviews as positive or negative using the text of the review. This is an example of binary—or two-class—classification, an important and widely applicable kind of machine learning problem.
XianxinMao
2021/07/31
2690
序列模型第二周作业2:Emojify!
在读取data/glove.6B.50d.txt你可能会遇到这样一个问题: 'gbk' codec can't decode byte 0x93 in position 3136 解压作业文件夹同名压缩包,并更改w2v_utils.py文件中的读取函数的with open部分如下:
Steve Wang
2019/05/28
2K0
序列模型第二周作业2:Emojify!
基于RNN的语言模型与机器翻译NMT
根据给定的文章内容,撰写摘要总结。
用户1147754
2018/01/03
1.9K0
基于RNN的语言模型与机器翻译NMT
GCN 论文英语表达总结
-------------------------------------------------------一条开始认真脸的分界线---------------------------------------------------------
张凝可
2020/04/08
8860
Residual_Networks_v2a
Welcome to the second assignment of this week! You will learn how to build very deep convolutional networks, using Residual Networks (ResNets). In theory, very deep networks can represent very complex functions; but in practice, they are hard to train. Residual Networks, introduced by He et al., allow you to train much deeper networks than were previously practically feasible.
列夫托尔斯昊
2020/08/25
9880
Residual_Networks_v2a
【最新】机器学习顶会 NIPS 2017 Pre-Proceedings 论文列表(附pdf下载链接)
【导读】机器学习领域顶尖学术会议——神经信息处理系统进展大会(Advances in NeuralInformation Processing Systems,NIPS),就是放在整个计算机科学界,也是数一数二的顶级学术会议。今年的NIPS将于 12 月份在美国长滩举行,本届NIPS共收到 3240 篇论文投稿,录用 678 篇,录用率为 20.9%;其中包括 40 篇口头报告论文和 112 篇 spotlight 论文。微软共中了16篇论文,其中微软亚洲研究院有4篇,Google有23篇。清华大学,今年共
WZEARW
2018/04/10
2.8K0
【最新】机器学习顶会 NIPS 2017 Pre-Proceedings 论文列表(附pdf下载链接)
LLM入门5 | SAM代码从入门到出门 | MetaAI
非常好加载,基本上pytorch和torchvision版本不太落后就可以加载。里面的model_type需要和模型参数对应上,"vit_h"或者"vit_l"或者"vit_b",即便加载最大的2.4G的vit_h模型,也只需要占用8G的显卡。算是非常小的模型了。这里SAM测试的效果,很多情况下效果并不太好,是一个foundation model,我觉得主要原因是模型参数比较少。导致他不能很好的解决所有的问题。正确用法是对小领域最微调。
机器学习炼丹术
2023/09/02
1.2K0
LLM入门5 | SAM代码从入门到出门 | MetaAI
Trigger_word_detection_v1a
Welcome to the final programming assignment of this specialization!
列夫托尔斯昊
2020/08/25
1.9K0
Going Deeper with Convolutions——GoogLeNet论文翻译——中英文对照
Tyan
2017/12/28
1.3K0
Going Deeper with Convolutions——GoogLeNet论文翻译——中英文对照
[源码解析] 模型并行分布式训练 Megatron (3) ---模型并行实现
NVIDIA Megatron 是一个基于 PyTorch 的分布式训练框架,用来训练超大Transformer语言模型,其通过综合应用了数据并行,Tensor并行和Pipeline并行来复现 GPT3,值得我们深入分析其背后机理。
罗西的思考
2022/11/28
2.2K0
[源码解析] 模型并行分布式训练 Megatron (3) ---模型并行实现
推荐阅读
相关推荐
WHEN NOT TO USE DEEP LEARNING
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 一、行转列原理:从行到列的数学逻辑
  • 二、方法详解:3 种行转列实战技巧
    • 方法 1:经典 CASE WHEN(通用版)
    • 方法 2:PIVOT 语句(简洁版)
    • 方法 3:动态列生成(进阶版)
  • 三、实战案例:复杂场景下的行转列
    • 案例 1:多维度聚合(年+季度+产品)
    • 案例 2:非数值型数据转列
  • 四、性能优化与常见问题
    • 1. 性能优化技巧
    • 2. 常见问题解决
  • 五、进阶技巧
    • 结合窗口函数
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档