将 Postgres 上的查询更改为仅使用标准 SQL 子句

Changing a query on Postgres to use only the Standard SQL Clauses

我在 Postgres 上做了一个查询,我使用了 Postgres 9.4 或更高版本中可用的 FILTER 子句,但我被告知我只能使用标准 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

所以,我已经尝试对每种动物进行子查询,但效果并不理想。

如果我正确理解 filter 的工作原理,可以使用 count 函数中的 case 表达式来翻译:

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 时。