如何使用SQL查询计算CITIZEN表中vaccination_date1非空记录的占比
如何计算CITIZEN表中vaccination_date1非空记录的占比?
嘿,你的思路方向是对的,但SQL语法上不能直接把两个COUNT语句像那样拼接,得把它们整合到同一个查询逻辑里才行。下面给你几个可行的方案,适配不同的使用习惯和数据库环境:
方案1:子查询分别统计分子分母
这种方式逻辑最直观,先分别算出vaccination_date1非空的记录数和总记录数,再做除法计算百分比:
-- Oracle 写法(需要FROM DUAL) SELECT (SELECT COUNT(ssrn) FROM CITIZEN WHERE vaccination_date1 IS NOT NULL) * 100.0 / (SELECT COUNT(ssrn) FROM CITIZEN) AS vaccination_rate FROM DUAL; -- MySQL/PostgreSQL 等可以省略FROM DUAL SELECT (SELECT COUNT(ssrn) FROM CITIZEN WHERE vaccination_date1 IS NOT NULL) * 100.0 / (SELECT COUNT(ssrn) FROM CITIZEN) AS vaccination_rate;
这里用100.0而不是100是为了避免整数除法导致结果被截断(比如如果占比是35.7%,用整数除法会得到35)。
方案2:用AVG+CASE简化计算
这是更简洁的写法,利用CASE语句把符合条件的记录标记为100.0,不符合的标记为0,再取平均值直接得到百分比:
SELECT AVG(CASE WHEN vaccination_date1 IS NOT NULL THEN 100.0 ELSE 0 END) AS vaccination_rate FROM CITIZEN;
这个方案不需要子查询,一次扫描表就能完成计算,效率更高。
方案3:COUNT+CASE组合
和方案1逻辑类似,但用单表扫描完成统计:
SELECT (COUNT(CASE WHEN vaccination_date1 IS NOT NULL THEN ssrn END) * 100.0 / COUNT(ssrn)) AS vaccination_rate FROM CITIZEN;
这里COUNT(CASE ...)只会统计vaccination_date1非空的记录(因为CASE返回NULL时会被COUNT忽略),分母的COUNT(ssrn)是总记录数(因为ssrn是主键,不会为NULL)。
补充说明
因为你的vaccination_date1字段定义是char(1),所以用IS NOT NULL来判断非空是完全正确的,不需要额外处理字符内容~
内容的提问来源于stack exchange,提问作者user14954375
相关产品推荐
相关产品推荐

