sql基础之行列转换
列转行
在 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
- 点赞
- 收藏
- 关注作者
评论(0)