我必须从三个表avg_salary,人员和电子邮件执行查询。这个简单的SQL查询工作正常。
SELECT avg_salary.id, COUNT(emails.message_from) AS email_PGA
FROM avg_salary, person, emails
WHERE person.works_in = avg_salary.id
AND person.email_address = emails.message_from
AND person.salary::numeric > avg_salary.avg
GROUP BY avg_salary.id
但是我希望在条件时添加另一列email_PLA
person.salary::numeric < avg_salary.avg
。我可以通过再次加入整个查询来做到这一点。但我希望在这种情况下使用CASE
。即使经过这么多次尝试,我也无法正确理解语法。
答案 0 :(得分:1)
我认为你需要另一个计数? 你需要这样的东西:
SUM(CASE WHEN (person.salary::numeric < avg_salary.avg) THEN 1 ELSE 0 END) AS email_PGA
答案 1 :(得分:1)
您可以使用案例expression
执行条件聚合,并始终使用显式JOIN
语法
SELECT avg_salary.id,
SUM(CASE WHEN p.salary::numeric > asal.avg THEN 1 ELSE 0 END) AS email_PGA,
SUM(CASE WHEN p.salary::numeric < asal.avg THEN 1 ELSE 0 END) AS email_PLA
FROM avg_salary asal,
INNER JOIN person p on p.works_in = asal.id
INNER JOIN emails e on e.message_from = p.email_address
--WHERE p.salary::numeric > asal.avg
GROUP BY avg_salary.id;
答案 2 :(得分:0)
如果在特定条件下需要不同的列,则必须执行不同的SQL查询。