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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 16:57:49