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

MYSQL如何合并相同ID行并将对应数据存入新增自定义列

MySQL行转列合并同ID多行解决方案

固定最多N行同ID场景(示例最多2行,直接使用以下语句即可)

先通过窗口函数给同ID、同NAME的记录按顺序标记行号,再通过分组聚合提取对应行号的字段值:

SELECT
    ID,
    NAME,
    MAX(CASE WHEN row_num = 1 THEN VALUE END) AS `VALUE 1`,
    MAX(CASE WHEN row_num = 1 THEN DESCRIPTION END) AS `DESCRIPTION 1`,
    MAX(CASE WHEN row_num = 2 THEN VALUE END) AS `VALUE 2`,
    MAX(CASE WHEN row_num = 2 THEN DESCRIPTION END) AS `DESCRIPTION 2`
FROM (
    SELECT 
        ID,
        NAME,
        VALUE,
        DESCRIPTION,
        -- 同ID分组内按自定义排序规则生成行号,可调整ORDER BY后的字段适配实际需求
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY VALUE ASC) AS row_num
    FROM your_table
) AS t
GROUP BY ID, NAME;

语句说明

  • 内层子查询用ROW_NUMBER()窗口函数,按ID分组后给每组内的行生成从1开始的序号,ORDER BY子句可根据实际排序需求调整,比如按数据插入时间、DESCRIPTION字段先后顺序等
  • 外层查询按ID和NAME分组,通过CASE WHEN匹配对应行号的字段值,用MAX聚合函数把分散在多行的值合并到同一行,无匹配值的位置会自动留空

同ID行数不固定的动态场景

如果提前不知道同ID最多对应多少行,可使用动态SQL自动生成查询列:

SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT
    CONCAT(
        'MAX(CASE WHEN row_num = ', row_num, ' THEN VALUE END) AS `VALUE ', row_num, '`, ',
        'MAX(CASE WHEN row_num = ', row_num, ' THEN DESCRIPTION END) AS `DESCRIPTION ', row_num, '`'
    )
) INTO @sql
FROM (
    SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY VALUE ASC) AS row_num FROM your_table
) AS t;

SET @sql = CONCAT('SELECT ID, NAME, ', @sql, ' FROM (
    SELECT ID, NAME, VALUE, DESCRIPTION,
    ROW_NUMBER() OVER (PARTITION BY ID ORDER BY VALUE ASC) AS row_num
    FROM your_table
) AS t GROUP BY ID, NAME');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

内容的提问来源于stack exchange,提问作者blizzy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:54:02