如何按条件计算计数
How to compute the count by a condition
我有以下 table(简称为 table
):
id name value group_id
PK varchar(32) integer integer
现在,我需要编写一个查询 returns 我 SUM(value)
按 group_id
和 COUNT(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;
我有以下 table(简称为 table
):
id name value group_id
PK varchar(32) integer integer
现在,我需要编写一个查询 returns 我 SUM(value)
按 group_id
和 COUNT(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;