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

SQL技术问询:统计同一ID对应不同值的数量并同行展示

解决SQL中同一ID下不同值的统计并拼接成一行的问题

嘿,这个需求我经常碰到,其实就是分组统计+字符串拼接的组合操作,我给你分不同主流数据库写了对应的SQL,你直接根据自己用的数据库套用就行:

MySQL/MariaDB 实现

先通过子查询统计每个ID下每个Question的出现次数,再用GROUP_CONCAT把统计结果拼接成指定格式:

SELECT 
    id,
    GROUP_CONCAT(CONCAT(count_num, ' ', Question) ORDER BY Question SEPARATOR ', ') AS Result
FROM (
    SELECT 
        id,
        Question,
        COUNT(*) AS count_num
    FROM your_table_name -- 替换成你的表名
    GROUP BY id, Question
) AS sub_query
GROUP BY id;

说明:

  • 内层子查询先算出每个ID对应每个Question的出现次数
  • GROUP_CONCAT负责把数量+空格+Question的字符串用, 分隔拼接
  • ORDER BY Question可以让拼接结果按Question的字母顺序排列,可选

PostgreSQL 实现

PostgreSQL用STRING_AGG函数来实现字符串聚合,用法和MySQL的GROUP_CONCAT类似:

SELECT 
    id,
    STRING_AGG(CONCAT(count_num, ' ', Question), ', ' ORDER BY Question) AS Result
FROM (
    SELECT 
        id,
        Question,
        COUNT(*) AS count_num
    FROM your_table_name -- 替换成你的表名
    GROUP BY id, Question
) AS sub_query
GROUP BY id;

SQL Server 实现

2017及以上版本(支持STRING_AGG)

SELECT 
    id,
    STRING_AGG(CONCAT(count_num, ' ', Question), ', ') WITHIN GROUP (ORDER BY Question) AS Result
FROM (
    SELECT 
        id,
        Question,
        COUNT(*) AS count_num
    FROM your_table_name -- 替换成你的表名
    GROUP BY id, Question
) AS sub_query
GROUP BY id;

2016及以下版本(用FOR XML PATH拼接)

如果你的SQL Server版本比较旧,就用这个写法:

SELECT 
    t.id,
    STUFF(
        (SELECT ', ' + CONCAT(count_num, ' ', Question)
         FROM (
             SELECT id, Question, COUNT(*) AS count_num
             FROM your_table_name -- 替换成你的表名
             GROUP BY id, Question
         ) AS sub
         WHERE sub.id = t.id
         ORDER BY sub.Question
         FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)'), 1, 2, ''
    ) AS Result
FROM (
    SELECT DISTINCT id
    FROM your_table_name -- 替换成你的表名
) AS t;

测试示例

你可以先插入你的测试数据验证:

-- 插入示例数据(适配所有数据库)
INSERT INTO your_table_name (id, Question) VALUES
(13, 'ABC'),
(13, 'ABC'),
(13, 'QWE'),
(13, 'ABC'),
(13, 'QWE'),
(13, 'ABC');

执行对应的SQL后,就能得到你想要的结果:

idResult
134 ABC, 2 QWE

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:45:32