假設我有一張擁有商店交易的表格。如何從單個查詢中返回多個聚合,所有聚合都有不同的約束?
我該如何計算其中含有「餅乾」一詞的交易數量,其中含有「蘇打水」的交易數量以及含有「餅乾」和「蘇打水」的交易數量它。
如果可能,這應該在一個查詢中。
假設我有一張擁有商店交易的表格。如何從單個查詢中返回多個聚合,所有聚合都有不同的約束?
我該如何計算其中含有「餅乾」一詞的交易數量,其中含有「蘇打水」的交易數量以及含有「餅乾」和「蘇打水」的交易數量它。
如果可能,這應該在一個查詢中。
您可以使用conditional aggregation
此:
select
sum(case when field like '%crackers%' then 1 else 0 end) crackercount,
sum(case when field like '%soda%' then 1 else 0 end) sodacount,
sum(case when field like '%soda%'
and field like '%crackers%' then 1 else 0 end) bothcount
from yourtable
在的Postgres 9.4或更高版本,使用專用aggregate FILTER
clause:
SELECT count(*) FILTER (WHERE col ILIKE '%crackers%') AS ct_cracker
, count(*) FILTER (WHERE col ILIKE '%soda%') AS ct_soda
, count(*) FILTER (WHERE col ILIKE ALL ('{%crackers%, %soda%}'::text[]) AS ct_both
FROM tbl
WHERE col ILIKE ANY ('{%crackers%, %soda%}'::text[]);
有一對夫婦的,對於舊版本的MySQL或工作的標準技術,也:
假設你想不區分大小寫的模式匹配,因此ILIKE
。
ANY
和結構是方便的功能,特別是對於較長的陣列,但不是嚴格必要的爲您的問題。此外,WHERE
子句不是嚴格需要的,但通常會提高性能。
詳情:
你可以做三個彙總查詢,然後工會它們,從而讓每個子查詢一行。或者,您可以在列列表中使用子查詢,並最終得到一行,每列包含一個子查詢計數(sgeddes具有這種類型的答案)。 – halfer
您實際使用哪種數據庫系統,Ricky?這裏有兩個數據庫標籤。 – halfer