在一次查询中获取忽略特定状态的供应商的取消率
Get the cancelling rate of a vendor ignoring a certain state, in one query
假设我有一个 table 表示具有以下属性的销售额:
- a
state
可以是 sold
、waiting
、unknown
或 cancelled
- 一个
vendor
- 一个
buyer
- a
cancellor
即 vendor
或 buyer
,如果销售的 state
是 cancelled
,而 null
其他州。
我想计算 Joe 的取消率。现在我正在执行两个 SQL 请求。第一个获取 Joe:
取消的销售数量
SELECT COUNT(*) AS n_cancelled FROM sales WHERE cancellor = "Joe"
第二个获取涉及Joe的销售额,不包括state
为unknown
或waiting
的销售额:
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)
假设我有一个 table 表示具有以下属性的销售额:
- a
state
可以是sold
、waiting
、unknown
或cancelled
- 一个
vendor
- 一个
buyer
- a
cancellor
即vendor
或buyer
,如果销售的state
是cancelled
,而null
其他州。
我想计算 Joe 的取消率。现在我正在执行两个 SQL 请求。第一个获取 Joe:
取消的销售数量SELECT COUNT(*) AS n_cancelled FROM sales WHERE cancellor = "Joe"
第二个获取涉及Joe的销售额,不包括state
为unknown
或waiting
的销售额:
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)