PostgreSQL:如何在使用 case 语句时避免被零除

DBE*_*BE7 2 sql postgresql

我试图将两个 case 语句分开。如何避免偶尔被零除?我似乎无法弄清楚NULLIF方法。

 SELECT
           ROUND(100 * SUM(CASE WHEN be.event IN ('a') THEN 1 ELSE 0 END) / SUM(CASE WHEN be.event IN ('b', 'a') THEN 1 ELSE 0 END), 2)  AS "% Instant Book Today"
    FROM booking_events be
    WHERE
          be.created_at >= current_date AND
          be.created_at < current_date + interval '1 day';
Run Code Online (Sandbox Code Playgroud)

解决这个问题的最有效方法是什么?

Gor*_*off 6

您可以NULLIF()用作:

SELECT ROUND(100 * SUM(CASE WHEN be.event IN ('a') THEN 1 ELSE 0 END) / 
                   NULLIF(SUM(CASE WHEN be.event IN ('b', 'a') THEN 1 ELSE 0 END), 0), 2
            ) AS "% Instant Book Today"
Run Code Online (Sandbox Code Playgroud)

或者,分母总是非负的,只需删除ELSE 0

SELECT ROUND(100 * SUM(CASE WHEN be.event IN ('a') THEN 1 ELSE 0 END) / 
                   SUM(CASE WHEN be.event IN ('b', 'a') THEN 1 END), 2
            ) AS "% Instant Book Today"
Run Code Online (Sandbox Code Playgroud)

或者,将查询写为:

SELECT ROUND(AVG(CASE WHEN be.event IN ('a') THEN 100.0 ELSE 0 END),
             2) as "% Instant Book Today"
FROM booking_events be
WHERE be.created_at >= current_date AND
      be.created_at < current_date + interval '1 day' AND
      be.event IN ('a', 'b');
Run Code Online (Sandbox Code Playgroud)