MySQL中的列转行通常是指将一个表中的多列数据转换为多行数据,这种操作在数据处理和分析中非常常见。实现列转行的方法有很多,其中最常用的是使用UNION ALL
或CASE WHEN
语句。
UNION ALL
:将多个SELECT语句的结果合并为一个结果集。CASE WHEN
:在SELECT语句中使用条件语句来转换列数据。UNION ALL
假设有一个表sales
,结构如下:
| id | product | sales_q1 | sales_q2 | sales_q3 | sales_q4 | |----|---------|----------|----------|----------|----------| | 1 | A | 100 | 150 | 200 | 250 | | 2 | B | 120 | 130 | 140 | 150 |
要将季度销售数据转换为行数据,可以使用以下SQL语句:
SELECT id, product, 'Q1' AS quarter, sales_q1 AS sales
FROM sales
UNION ALL
SELECT id, product, 'Q2' AS quarter, sales_q2 AS sales
FROM sales
UNION ALL
SELECT id, product, 'Q3' AS quarter, sales_q3 AS sales
FROM sales
UNION ALL
SELECT id, product, 'Q4' AS quarter, sales_q4 AS sales
FROM sales;
CASE WHEN
同样以上面的sales
表为例,可以使用以下SQL语句实现列转行:
SELECT id, product,
MAX(CASE WHEN quarter = 'Q1' THEN sales END) AS sales_q1,
MAX(CASE WHEN quarter = 'Q2' THEN sales END) AS sales_q2,
MAX(CASE WHEN quarter = 'Q3' THEN sales END) AS sales_q3,
MAX(CASE WHEN quarter = 'Q4' THEN sales END) AS sales_q4
FROM (
SELECT id, product, 'Q1' AS quarter, sales_q1 AS sales
FROM sales
UNION ALL
SELECT id, product, 'Q2' AS quarter, sales_q2 AS sales
FROM sales
UNION ALL
SELECT id, product, 'Q3' AS quarter, sales_q3 AS sales
FROM sales
UNION ALL
SELECT id, product, 'Q4' AS quarter, sales_q4 AS sales
FROM sales
) t
GROUP BY id, product;
原因:当数据量较大时,使用UNION ALL
或CASE WHEN
可能会导致性能问题。
解决方法:
原因:在使用UNION ALL
时,如果没有正确去重,可能会导致数据重复。
解决方法:
DISTINCT
:在UNION ALL
后面加上DISTINCT
关键字,去除重复数据。GROUP BY
:在子查询中使用GROUP BY
来去重。MySQL UNION ALL 语法 MySQL CASE WHEN 语法
希望这些信息对你有所帮助!
领取专属 10元无门槛券
手把手带您无忧上云