如何从单个查询返回多个聚合,所有聚合都具有不同的约束?

时间:2016-02-26 00:13:47

标签: mysql sql postgresql aggregate

假设我有一个包含商店交易的表。

如何计算其中包含“crackers”一词的交易数量,其中包含“soda”的交易数量,以及同时包含“crackers”和“soda”的交易数量

如果可能,这应该在一个查询中。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

ANYALL结构是方便的功能,特别是对于较长的数组,但对于您的问题并非严格必需。此外,并不严格需要WHERE子句,但通常会提高性能。

详细说明: