PostgreSQL根据条件获取项目数

问题描述

我有一张这样的桌子

水果-状态
-------------------
苹果-新
苹果-好的
苹果-好的
苹果-不好
香蕉-新
香蕉-好的
香蕉-不好
橙色-新
橙色-好的
橙色-好的
橙色-好的
橙色-好的
橙色-好的

我想获取未处于“不良”状态的物品以及该物品处于“良好”状态的次数。类似这样的事情:

水果-好吧
----------------------
橙色-5

此时,苹果和香蕉处于“不良”状态。 和橘子还可以五次(不包括新状态)。

我尝试过这种方法,但它不能正常工作,因为它也使苹果和香蕉的状态良好。

select * from (select fruit,count(fruit) AS okaycount
from fruits
where  state='okay'
group by fruit) as din
order by din.okaycount desc
limit 10;

也尝试过这个。没有用。

SELECT distinct ndt.fruit,COUNT( ndt.fruit ) as okaycount
FROM(select * from fruits where fruit in (select distinct correlationid 
from fruits
where wcsstatus!='bad')) as ndt
GROUP BY ndt.fruit
HAVING count(*) > 3;

解决方法

在Postgres中,我会在having子句中用过滤计数和布尔聚合来表达这一点:

select fruit,count(*) filter(where status = 'okay') cnt
from fruits
group by fruit
having not bool_or(status = 'bad')
,

根据所需结果,可以使用:

select fruit,sum( (status = 'okay')::int )
from fruit
group by fruit
having sum( (status = 'bad')::int ) = 0;