Изменение запроса в Postgres для использования только стандартных предложений SQL

Я выполнил запрос на Postgres и использовал предложение FILTER, которое доступно в Postgres 9.4 или более поздней версии, но мне сказали, что я могу использовать только стандартные SQL-предложения.

Мой запрос касается подсчета количества убитых животных, количество убитых животных будет показано для каждого предприятия и типа животных:

Enterprise(id or name) || cow || sheep || chicken
MacDonals              ||  5  ||  5  ||    1     
Burguer King           ||  7  ||  4  ||    2     
KFC                    ||  1  ||  0  ||    10    

Поэтому я сделал этот собственный запрос на POSTGRES 9.4:

SELECT e.name
,COALESCE (COUNT(a.id) FILTER (WHERE a.type='cow'))
,COALESCE (COUNT(a.id) FILTER (WHERE a.type='sheep'))
,COALESCE (COUNT(a.id) FILTER (WHERE a.type='chicken'))
FROM enterprise e
INNER JOIN animal_enterprise ae
ON ( ae.enterprise_id = e.id)
INNER JOIN animal a
ON ( ae.animal_id=a.id )
GROUP BY e.id

Итак, я попытался сделать подзапросы для каждого типа животных, но это не так хорошо, как следовало бы.

1 ответ

Решение

Если я правильно понимаю, как filter работает, это можно перевести с помощью case выражение внутри count функция:

SELECT e.name
  ,COUNT(case when a.type='cow' then 'X' end) as cow
  ,COUNT(case when a.type='sheep' then 'X' end) as sheep
  ,COUNT(case when a.type='chicken' then 'X' end) as chicken
FROM enterprise e
INNER JOIN animal_enterprise ae
  ON ae.enterprise_id = e.id
INNER JOIN animal a
  ON ae.animal_id = a.id
GROUP BY e.id, e.name

Я проигнорировал несколько аномалий в вашем запросе, таких как использование p.id?? когда нет псевдонима p определяется в любом месте, или использование coalesce без второго параметра.

Другие вопросы по тегам