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

MySQL分组查询:如何将性别统计结果合并为单行展示

解决MySQL行转列:将每月男女统计合并到同一行

这是典型的行转列需求,咱们可以通过MySQL的条件聚合来实现你想要的效果,分两种场景给你解决方案:

场景1:每行展示一个月份的男女统计(常规表格格式)

如果你希望结果是每行对应一个月份,同时显示该月男性(M)和女性(F)的数量,直接用条件聚合即可,不需要多余的子查询:

SELECT 
    MONTH(signDate) AS monthDate,
    SUM(IF(sex = 'M', 1, 0)) AS M,
    SUM(IF(sex = 'F', 1, 0)) AS F
FROM dbPaciente.tblUser
GROUP BY MONTH(signDate)
ORDER BY monthDate ASC;

逻辑说明:

  • GROUP BY MONTH(signDate) 按月份对数据分组,确保每个月份只生成一行结果
  • SUM(IF(sex = 'M', 1, 0)) 统计分组内男性的数量:符合条件的记录计1,否则计0,求和后就是该月男性总数
  • 同理,SUM(IF(sex = 'F', 1, 0)) 统计女性数量
  • 最后按月份升序排序,保证结果顺序正确

场景2:将所有结果拼成一行(匹配你给出的期望格式)

如果你想要把表头和所有月份的统计结果拼成单一的一行输出(就像你示例里的monthDate M F 01 0 1 ...格式),可以在上面的基础上用GROUP_CONCAT和CONCAT_WS拼接内容:

SELECT CONCAT_WS(' ', 
    'monthDate', 'M', 'F',
    GROUP_CONCAT(
        CONCAT_WS(' ', monthDate, M, F) 
        ORDER BY monthDate ASC 
        SEPARATOR ' '
    )
) AS result
FROM (
    SELECT 
        MONTH(signDate) AS monthDate,
        SUM(IF(sex = 'M', 1, 0)) AS M,
        SUM(IF(sex = 'F', 1, 0)) AS F
    FROM dbPaciente.tblUser
    GROUP BY MONTH(signDate)
) AS temp;

逻辑说明:

  • 子查询先按场景1的方式生成每个月份的统计数据
  • GROUP_CONCAT把每个月份的monthDate M F字符串用空格连接起来
  • CONCAT_WS再把表头和拼接后的统计内容合并成一行,用空格分隔

为什么你原来的查询不行?

你原来的查询里,子查询按monthDate, sex分组会把每个月份的男女拆成两行,外层再按monthDate分组时,MySQL会随机取每组中的一条sex和count(1)值,导致结果不准确,而且也无法实现同一行展示男女数据的需求。用条件聚合可以直接在分组时就完成男女数量的统计,一步到位更高效准确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:53:36