带有case语句的sql count查询

时间:2018-05-10 03:52:11

标签: sql postgresql case

我必须从三个表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。即使经过这么多次尝试,我也无法正确理解语法。

3 个答案:

答案 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查询。