如何按条件计算计数

How to compute the count by a condition

我有以下 table(简称为 table):

id       name         value      group_id
PK    varchar(32)    integer     integer

现在,我需要编写一个查询 returns 我 SUM(value)group_idCOUNT(name) 分组,其中 name like '%me%'(我不需要只计算按 group_id 分组的计数,我需要计算满足条件的计数。

但是,我需要在不编写子查询的情况下执行此操作,而且我仅限于 9.2。我倾向于编写一个特定于该需求的自定义聚合函数。这是一个正确的解决方案吗?

在 9.4 中,您可以使用过滤聚合:

select group_id, 
       sum(value)
       count(name) filter (where name like '%me%')
from the_table
group by group_id;

对于早期版本,您需要使用 CASE 语句:

select group_id, 
       sum(value)
       count(case when name like '%me%' then 1 end) 
from the_table
group by group_id;

这是可行的,因为聚合将忽略空值,如果名称不匹配,case 语句将 return 一个 NULL

使用条件聚合

SELECT GROUP_ID, 
       SUM(VALUE) as SUM_VALUE
       SUM(CASE WHEN NAME LIKE '%ME%' THEN 1 ELSE 0 END) as COUNT_VALUE
FROM 
    TABLE
GROUP BY 
    GROUP_ID;

另请参阅 CASE 表达式如何非常方便 https://exploresql.com/2015/08/18/multipurpose-case-expression/

应该注意的是,可以通过将 bool 转换为更短的 int 来替换大小写(LIKE 可以替换为 ~~,但后者更短且可读性差)。

SELECT   group_id 
         ,Sum(value) AS sum_value
         ,Sum((name LIKE '%me%')::int) AS count_value 
FROM     table
GROUP BY group_id;