sql基础之行列转换

举报
yd_261177225 发表于 2024/11/21 22:20:51 2024/11/21
【摘要】 列转行在 SQL 中,转换数据以按列排列的值成为按行排列的值(即所谓的“列转行”或“列转行”)是常见的数据操作需求。这个操作在不同的数据库管理系统中可以通过不同的技术手段来实现。以下是几种常见的数据库系统中实现列转行的方法:使用 UNION ALL(适用于所有 SQL 数据库)如果你的列数是固定的,可以使用 UNION ALL 将多个列的数据合并到一个新的结果集的单一列中。示例数据假设有一...

列转行

在 SQL 中,转换数据以按列排列的值成为按行排列的值(即所谓的“列转行”或“列转行”)是常见的数据操作需求。这个操作在不同的数据库管理系统中可以通过不同的技术手段来实现。以下是几种常见的数据库系统中实现列转行的方法:

使用 UNION ALL(适用于所有 SQL 数据库)
如果你的列数是固定的,可以使用 UNION ALL 将多个列的数据合并到一个新的结果集的单一列中。

示例数据
假设有一个表 Sales:

product_id    sales_q1    sales_q2    sales_q3    sales_q4
1    100    150    200    250
2    110    160    210    260

以下是一个将每个季度的销售数据转为行的查询示例:

SELECT product_id, ‘Q1’ AS quarter, sales_q1 AS sales FROM Sales
UNION ALL
SELECT product_id, ‘Q2’, sales_q2 FROM Sales
UNION ALL
SELECT product_id, ‘Q3’, sales_q3 FROM Sales
UNION ALL
SELECT product_id, ‘Q4’, sales_q4 FROM Sales;
结果:

product_id    quarter    sales
1    Q1    100
1    Q2    150
1    Q3    200
1    Q4    250
2    Q1    110
2    Q2    160
2    Q3    210
2    Q4    260

行转列

使用 case when(适用于所有 SQL 数据库)

这种方法适用于所有支持 SQL 的数据库,适用于数据量不大的简单场景。

示例数据
假设有一个表 Sales:

product_id    quarter    sales
1    Q1    100
1    Q2    150
1    Q3    200
1    Q4    250
2    Q1    110
2    Q2    160
2    Q3    210
2    Q4    260

使用 CASE 语句和 GROUP BY 来实现行转列:

SELECT
    product_id,
    SUM(CASE WHEN quarter = ‘Q1’ THEN sales ELSE 0 END) AS sales_q1,
    SUM(CASE WHEN quarter = ‘Q2’ THEN sales ELSE 0 END) AS sales_q2,
    SUM(CASE WHEN quarter = ‘Q3’ THEN sales ELSE 0 END) AS sales_q3,
    SUM(CASE WHEN quarter = ‘Q4’ THEN sales ELSE 0 END) AS sales_q4
FROM Sales
GROUP BY product_id;

product_id    sales_q1    sales_q2    sales_q3    sales_q4
1    100    150    200    250
2    110    160    210    260

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。