在 SAS PROC SQL 中与 GROUP BY 中的 table 中的 return NULL 计数为 0

COUNT to return NULL as 0 in same table in SAS PROC SQL with GROUP BY

我正在执行一项任务,其中有 1 个 table。交易、交易日期和商店名称都有唯一的 ID。 我的任务是计算每家商店在三月份的交易数量。

这本身很简单:

proc sql;
CREATE TABLE marchtransactions AS SELECT DISTINCT COUNT(tr_id) , store_name
FROM transactions
WHERE MONTH(tr_date)=3
GROUP BY store_name;
quit;

这将导致 table 只有在 3 月份有交易时商店才会出现。 如果商店没有交易,它将是 NULL,因此,它根本不会出现在 table 中。

虽然从技术上讲任务很好,但我真的很想展示我 table 中的每一家商店,即使是那些在 3 月份没有交易的商店。 所以我也想查看 0 计数值。

在网上看过很多不同的场景:IFNULL函数,LEFT JOIN,RIGHT JOIN等,但这只是一个table,而在SAS PROC SQL中,有没有 IFNULL 这样的东西。

我尝试过使用商店名称制作助手 table 并使用 LEFT JOIN,但我没有成功。我什至尝试使用 CASE WHEN,但完全没有成功(请记住,我是一个初学者,但我可能做错了其中一件事情):(

知道如何进行这项工作吗?

不要将此限制为第 3 个月的行。查看所有行,但只有 count 个月 3。(请删除多余的 DISTINCT。)

SELECT
  store_name,
  COUNT(CASE WHEN MONTH(tr_date) = 3 THEN 1 END) AS in_march
FROM transactions
GROUP BY store_name
ORDER BY store_name;

顺便说一下,这称为条件聚合(在聚合中使用 CASE WHENFILTER)。

在 SAS 中,布尔表达式的计算结果为 1 (TRUE) 或 0 (FALSE)。因此,要“计算”一个条件发生了多少次,只需对条件求和即可。

proc sql;
  CREATE TABLE marchtransactions AS
    SELECT store_name, sum(MONTH(tr_date)=3) as march_count
    FROM transactions
    GROUP BY store_name
  ;
quit;

如果您必须在其他一些 SQL 实现中做同样的事情,只需使用 CASE 子句。

sum(case when (MONTH(tr_date)=3) then 1 else 0 end) as march_count