如何在PROC SQL中保留计数为0的交通方式统计条目?
解决SAS统计交通方式时保留0计数条目问题
要确保结果始终包含全部12种交通方式(包括使用人数为0的条目),核心思路是用包含所有交通方式的维度表与统计结果做左连接,将缺失的计数补为0。具体实现步骤如下:
1. 创建包含全部12种交通方式的维度表
如果没有现成的维度表,手动创建一个临时表,列出所有交通方式的取值(替换成你实际的R_fard_h编码/名称):
PROC SQL; CREATE TABLE transport_list AS SELECT * FROM VALUES ( ('步行'), ('公交'), ('地铁'), ('私家车'), ('出租车'), ('自行车'), ('火车'), ('飞机'), ('轮船'), ('网约车'), ('共享单车'), ('其他') ) AS t(R_fard_h); QUIT;
注:如果
R_fard_h是数字类型(如1-12),则把括号内的字符串改成对应数字,比如(1), (2), ..., (12)。
2. 左连接维度表与统计结果,补0并计算占比
通过左连接保留维度表的所有条目,用COALESCE函数将缺失的计数转为0,再计算占比:
PROC SQL; CREATE TABLE hjälptabell_transport_SE AS SELECT tl.R_fard_h, COALESCE(st.antal, 0) AS antal, COALESCE(st.antal, 0) / SUM(COALESCE(st.antal, 0)) OVER () AS kvot FROM transport_list tl LEFT JOIN ( -- 原统计逻辑,仅筛选有数据的交通方式 SELECT R_fard_h, COUNT(R_fard_h) AS antal FROM data_resor14_2 WHERE R_fard_h IS NOT MISSING AND R_res_land_grp="Sverige" GROUP BY R_fard_h ) st ON tl.R_fard_h = st.R_fard_h; QUIT;
关键逻辑说明:
- 左连接:保证维度表中的12种交通方式全部保留,即使统计子查询中没有对应条目。
- COALESCE函数:将左连接后缺失的
antal(即使用人数为0的情况)转换为0。 - 窗口函数SUM(...) OVER ():计算所有实际使用人数的总和(0不影响总和),确保占比计算逻辑与原需求一致。
如果你的系统中已经存在包含全部交通方式的维度表(如业务系统中的基础代码表),直接用该表替换上述的transport_list即可,无需手动创建。
内容的提问来源于stack exchange,提问作者Magnus
相关产品推荐
相关产品推荐

