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后,就能得到你想要的结果:
| id | Result |
|---|---|
| 13 | 4 ABC, 2 QWE |
内容的提问来源于stack exchange,提问作者Jatin Garg
相关产品推荐
相关产品推荐

