SAS计算区域未按时提交调查的设施占比问题咨询
问题解答
首先,不需要单独创建两个表再进行左连接,可以在单个PROC SQL查询中直接完成目标占比的计算,这样更简洁高效。
优化后的SQL代码
proc sql; SELECT Region, COUNT(DISTINCT CASE WHEN DaysDiff > 21 AND DaysDiff < 70 THEN Facility END) AS missing_count, COUNT(DISTINCT Facility) AS total_eligible_count, ROUND( (COUNT(DISTINCT CASE WHEN DaysDiff > 21 AND DaysDiff < 70 THEN Facility END) / COUNT(DISTINCT Facility)), 0.01 ) AS missing_ratio FROM have WHERE DaysDiff < 70 /* 仅统计近10周提交过的机构 */ GROUP BY Region; quit;
代码说明
- 用
CASE WHEN条件直接筛选出"超过21天且不足70天未提交"的机构,一次统计出两类机构数量,避免分两次查询。 COUNT(DISTINCT Facility)直接获取区域内近10周有提交记录的机构总数。- 通过除法计算占比,并用
ROUND函数保留两位小数,让结果更直观。
对原代码的补充修正提示
- 原数据步第一行
set want;应为读取原始调查数据表(比如命名为survey_data),否则逻辑会出错,建议修正:
Data have; set survey_data; /* 替换为你的原始调查数据表名 */ DaysDiff = intck('day', 调查提交日期, today()); /* 注意变量名要和原始表的列名一致,原代码用的Date需确认实际列名 */ run;
- 提取每个机构最新提交记录时,排序需按
Facility分组后对Date降序排列,确保拿到最新的提交日期:
proc sort data=have; by Facility descending Date; run; data have; set have; by Facility; if first.Facility; /* 取每个机构的第一条(即最新提交)记录 */ run;
内容的提问来源于stack exchange,提问作者NickName
相关产品推荐
相关产品推荐

