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

SQL如何合并非0值,实现按年聚合男女统计结果?

搞定同一年份的性别统计合并问题

嘿,看你的情况,现在查询出来的结果把同一年份的男女人数拆成两行显示了,这确实挺闹心的。我来帮你理清楚怎么改成你要的合并效果:

最快的修正方式:调整原始聚合查询

首先,咱们先确保分组逻辑是完全围绕年份来的,把你的SQL改成这样试试:

SELECT 
    DATE_PART('YEAR', BIRTHDATE) AS YEAR,
    SUM(CASE WHEN GENDER = 'M' THEN 1 ELSE 0 END) AS MAN,
    SUM(CASE WHEN GENDER = 'F' THEN 1 ELSE 0 END) AS FEMALE
FROM YOUR_TABLE_NAME
-- 可选:如果有生日为空的行,加这句过滤掉,避免出现年份为NULL的分组
WHERE BIRTHDATE IS NOT NULL
GROUP BY DATE_PART('YEAR', BIRTHDATE);

我把原来的GROUP BY 1改成了明确的年份表达式,这样能避免因为列顺序变化导致的意外分组问题。而且这个查询会把同一年份下所有男性和女性的数量直接累加,应该就能得到你要的一行对应一个年份的结果。

备选方案:对现有结果二次聚合

要是因为某些原因你没法直接改原始查询,也可以把你当前的查询结果当成临时表,再做一次聚合:

SELECT 
    YEAR,
    SUM(MAN) AS MAN,
    SUM(FEMALE) AS FEMALE
FROM (
    -- 这里把你原来的查询放进来
    SELECT 
        DATE_PART('YEAR', BIRTHDATE) AS YEAR,
        SUM(CASE WHEN GENDER = 'M' THEN 1 ELSE 0 END) AS MAN,
        SUM(CASE WHEN GENDER = 'F' THEN 1 ELSE 0 END) AS FEMALE
    FROM YOUR_TABLE_NAME
    GROUP BY DATE_PART('YEAR', BIRTHDATE)
) AS temp_results
GROUP BY YEAR;

为啥你原来的查询会拆成两行?

大概率是这几个原因之一:

  • 你的BIRTHDATE字段里可能有格式不一致的日期,导致DATE_PART返回的年份看似相同但实际不一样(比如一个是数字1970,一个是字符串'1970')
  • 实际执行的SQL里不小心多分组了其他字段(比如复制粘贴时带了额外的分组列)
  • 有NULL值在捣乱,但从你的输出来看这个可能性不大

你可以先查一下DATE_PART('YEAR', BIRTHDATE)的返回值类型和具体内容,确认同一年份的结果是完全一致的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:53:11