2016-02-26 64 views
-1

假設我有一張擁有商店交易的表格。如何從單個查詢中返回多個聚合,所有聚合都有不同的約束?

我該如何計算其中含有「餅乾」一詞的交易數量,其中含有「蘇打水」的交易數量以及含有「餅乾」和「蘇打水」的交易數量它。

如果可能,這應該在一個查詢中。

+0

你可以做三個彙總查詢,然後工會它們,從而讓每個子查詢一行。或者,您可以在列列表中使用子查詢,並最終得到一行,每列包含一個子查詢計數(sgeddes具有這種類型的答案)。 – halfer

+0

您實際使用哪種數據庫系統,Ricky?這裏有兩個數據庫標籤。 – halfer

回答

2

您可以使用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 
2

的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子句不是嚴格需要的,但通常會提高性能。

詳情: