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

Oracle Apex中SQL带条件COUNT统计60岁以上人口占比问题

问题解决方案

你的原始SQL存在多处语法和逻辑错误,以下是修正方案:

错误项说明

  • 无关联条件的笛卡尔积:from person, person c属于无关联条件的多表查询,会生成大量冗余重复数据,完全不符合统计需求
  • 非法聚合函数调用:c.count()是错误语法,聚合函数COUNT()不能加表别名作为前缀
  • 年龄计算逻辑粗糙:直接年份相减未考虑出生日期的月日,会存在1岁以内的误差

最优实现方案(条件聚合,单表扫描性能最优)

使用条件聚合在一次表扫描中完成两类数据的统计,无需关联多表:

SELECT
  town,
  ROUND(
    COUNT(
      CASE
        -- 计算到2021年12月31日的实际年龄≥60岁才统计
        WHEN MONTHS_BETWEEN(DATE '2021-12-31', birth_date) / 12 >= 60
        THEN 1
      END
    ) * 100 / COUNT(*),
    2
  ) AS "60岁以上人口占比(%)"
FROM person
GROUP BY town;

逻辑说明

  • 聚合函数COUNT()会自动忽略CASE WHEN返回的NULL值,因此只会统计满足年龄≥60的人群数量
  • 分母COUNT(*)统计对应城镇的所有人口数
  • 外层ROUND()保留2位小数,方便展示百分比数值
  • 如果你不需要严格按周岁计算,仅要年份差值≥60,可以将CASE WHEN的条件替换为2021 - TO_NUMBER(TO_CHAR(birth_date, 'YYYY')) >= 60

额外注意

如果你的PERSON表存在已死亡人员数据,需要统计2021年在世的人口,可在GROUP BY前添加WHERE过滤条件,例如存在death_date字段的情况下:

WHERE death_date IS NULL OR death_date > DATE '2021-12-31'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 21:06:03