MySQL按相同值分组将多行合并为一行的实现方法求助
解决方案:将同一公司的多行指标合并为单条记录
看来你需要把同一公司的多行数据(分别对应yearly、monthly、budget三个指标)合并成单条记录展示,这是典型的行转列需求,我给你两种适配不同MySQL版本的实用方案:
方案1:通用CASE WHEN语法(兼容所有MySQL版本)
这个方法不管你用的是哪个MySQL版本都能生效,先假设你的原始表结构是这样的(如果你的表字段名不同,直接替换即可):
-- 示例表结构 CREATE TABLE company_metrics ( company_name VARCHAR(100), -- 公司名称 metric_type VARCHAR(20), -- 指标类型,取值为'yearly'/'monthly'/'budget' metric_value DECIMAL(10,2) -- 指标对应的值 );
对应的查询SQL如下:
SELECT company_name, -- 匹配yearly类型的行,取出对应值 MAX(CASE WHEN metric_type = 'yearly' THEN metric_value END) AS yearly, -- 匹配monthly类型的行,取出对应值 MAX(CASE WHEN metric_type = 'monthly' THEN metric_value END) AS monthly, -- 匹配budget类型的行,取出对应值 MAX(CASE WHEN metric_type = 'budget' THEN metric_value END) AS budget FROM company_metrics -- 按公司名称分组,聚合同一公司的所有行 GROUP BY company_name;
原理说明
CASE WHEN会根据metric_type匹配对应的行,提取出该指标的值,不匹配的行则返回NULLMAX()聚合函数会自动忽略NULL值,只保留同一公司下每个指标的有效数值- 最后通过
GROUP BY company_name将同一公司的所有数据合并为单条记录
方案2:PIVOT语法(MySQL 8.0及以上版本可用)
如果你的MySQL版本是8.0或更高,可以用更简洁的PIVOT专用行转列语法:
SELECT * FROM company_metrics PIVOT ( -- 指定聚合函数,这里用MAX因为每个公司每个指标只有一行数据 MAX(metric_value) -- 指定要转成列的字段,以及对应的列名 FOR metric_type IN ('yearly' AS yearly, 'monthly' AS monthly, 'budget' AS budget) ) AS pivoted_result;
特殊场景适配:如果原始表每行仅含一个非空指标
要是你的原始表结构是每行只填充一个指标字段(其他为NULL),比如:
CREATE TABLE company_data ( company_name VARCHAR(100), yearly DECIMAL(10,2), monthly DECIMAL(10,2), budget DECIMAL(10,2) );
那查询会更简单,直接用聚合函数聚合每个字段即可:
SELECT company_name, MAX(yearly) AS yearly, MAX(monthly) AS monthly, MAX(budget) AS budget FROM company_data GROUP BY company_name;
内容的提问来源于stack exchange,提问作者vamsi
相关产品推荐
相关产品推荐

