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

