Изменение запроса в 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
без второго параметра.