SAS PROC SQL单表分组统计时COUNT空值返回0的实现方案
SAS统计全部门店3月交易笔数(无交易补0)实现方案
核心逻辑
先拿到全部门店的唯一名单,再和3月的交易统计结果做左连接,用SAS PROC SQL支持的COALESCE函数(等价于其他数据库的IFNULL)将空的统计值替换为0即可。
完整实现代码
proc sql; /* 1. 生成全部门店唯一名单:如果有单独的门店维度表可直接替换这一步 */ CREATE TABLE all_stores AS SELECT DISTINCT store_name FROM transactions; /* 2. 左连接统计3月交易笔数,无交易的门店统计值补0 */ CREATE TABLE marchtransactions AS SELECT a.store_name, COALESCE(b.tr_count, 0) AS march_tr_count LABEL='3月交易笔数' FROM all_stores a LEFT JOIN ( /* 子查询先单独统计3月有交易的门店的交易笔数 */ SELECT store_name, COUNT(tr_id) AS tr_count FROM transactions WHERE MONTH(tr_date) = 3 GROUP BY store_name ) b ON a.store_name = b.store_name; quit;
常见错误说明
你之前左连接没成功大概率是踩了以下坑:
- 不要把
MONTH(tr_date)=3的筛选条件放到外层的WHERE子句中,否则左连接生成的无3月交易的空值行就会被过滤,回到仅展示有交易门店的结果 - 原代码中COUNT前加
DISTINCT是多余的,GROUP BY按门店分组后每个门店的统计结果本身就是唯一的 - 如果有单独的全部门店主数据表(包含从未产生过交易的门店),替换第一步的all_stores表统计结果会更准确
内容的提问来源于stack exchange,提问作者Noxter
相关产品推荐
相关产品推荐

