Postgresql получает количество элементов на основе условия

#sql #postgresql #count #postgresql-9.4 #having-clause

#sql #postgresql #количество #postgresql-9.4 #наличие-предложение

Вопрос:

У меня есть таблица примерно такого типа

плодовое состояние
——————-
яблоко — новое
яблоко — хорошо
яблоко — хорошо
яблоко — плохой
банан — новый
банан — хорошо
банан — плохой
апельсин — новый
апельсин — хорошо апельсин — хорошо
апельсин — хорошо
апельсин — хорошо
апельсин — хорошо
апельсин -хорошо

Я хочу получить элементы, которые не находятся в «плохом» состоянии, и сколько раз это было «хорошо».Что-то вроде этого:

fruit — okaycount
———————-
апельсин — 5

На данный момент Apple и banana находятся в «плохом» состоянии. и апельсины в порядке пять раз (не считая нового состояния).

Я попробовал это, и оно не работает, поскольку оно также выдает состояние apple и banana ‘okay’.

 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;
  

Комментарии:

1. Что вы имеете в виду «на данный момент»? Таблицы SQL представляют собой неупорядоченные наборы.

2. я имел в виду, что яблоки и бананы не нужно выбирать. но запрос, который я использовал, также собирал яблоки и бананы.

Ответ №1:

В Postgres я бы сформулировал это с помощью счетчика фильтрации и логической агрегации в having предложении:

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

Ответ №2:

На основе желаемых результатов вы можете использовать:

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