SQL按姓名分组查询无法显示多条同名记录全部属性问题求助
你当前的写法错误出在HAVING条件的逻辑上,你把明细拼接的逻辑放在了过滤条件里,这部分逻辑应该放到SELECT的字段输出部分处理,HAVING是用来过滤分组结果的,不能用来定义输出字段的内容。
正确实现语句(MySQL环境)
SELECT name, IF( COUNT(*) = 1, CAST(COUNT(*) AS CHAR), CONCAT(COUNT(*), ' ', GROUP_CONCAT('(', empId, ',', name, ',', gender, ')' SEPARATOR '')) ) AS `count` FROM Salesman GROUP BY name ORDER BY name ASC;
逻辑说明
- 按name分组后先用
COUNT(*)拿到同姓名的记录数 - 用IF判断计数大小:如果计数为1,直接输出计数值;如果计数大于1,用
CONCAT把计数值和拼接好的明细串拼到一起 GROUP_CONCAT里手动给每条记录拼接前后括号,分隔符设为空字符串,最终输出格式就是(7,Moeen,F)(11,Moeen,M)的形式- 别名直接用
count即可匹配你要的输出表头
其他数据库适配
如果是PostgreSQL环境,把GROUP_CONCAT替换为STRING_AGG即可,语法如下:
SELECT name, CASE WHEN COUNT(*) = 1 THEN COUNT(*)::VARCHAR ELSE CONCAT(COUNT(*), ' ', STRING_AGG(CONCAT('(', empId, ',', name, ',', gender, ')'), '')) END AS count FROM Salesman GROUP BY name ORDER BY name ASC;
内容的提问来源于stack exchange,提问作者Sl33pyWalrus
相关产品推荐
相关产品推荐

