在一次查询中获取忽略特定状态的供应商的取消率

Get the cancelling rate of a vendor ignoring a certain state, in one query

假设我有一个 table 表示具有以下属性的销售额:

我想计算 Joe 的取消率。现在我正在执行两个 SQL 请求。第一个获取 Joe:

取消的销售数量
SELECT COUNT(*) AS n_cancelled FROM sales WHERE cancellor = "Joe"

第二个获取涉及Joe的销售额,不包括stateunknownwaiting的销售额:

SELECT COUNT(*) AS n_sales FROM sales
WHERE
  STATE in ("sold", "cancelled")
  AND (vendor = "Joe" OR buyer = "Joe")

然后我通过将这两个请求的结果相除来计算我的取消率。

我有兴趣在一个请求中执行此操作,该请求将输出取消率以及用于计算取消率的销售额(n_sales 此处)。我该怎么做?

您可以使用条件聚合:

SELECT SUM(cancellor = 'Joe') as n_cancelled,
       SUM(state in ('sold', 'cancelled') AND 'Joe' IN (vendor, buyer)) AS n_sales
FROM sales
WHERE ( (cancellor = 'Joe') or
        (state in ('sold', 'cancelled') AND 'Joe' IN (vendor, buyer))
      );

您也可以在查询中进行除法。

注意:这保留了 WHERE 子句,这不是绝对必要的。但是在聚合数据之前减少行数可以提高性能。

一次查询即可完成:

SELECT 
    ( SELECT ... ) /   -- How many cancelled (as already formulated)
    ( SELECT ... );    -- Total number (as already formulated)