You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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匹配对应的行,提取出该指标的值,不匹配的行则返回NULL
  • MAX()聚合函数会自动忽略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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:52:06