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
相关产品推荐
相关产品推荐

