如何在多表关联的COUNT查询中用CASE语句新增工资统计列?
解决方法:用CASE表达式实现条件计数,避免重复关联
没问题,你完全可以用CASE表达式配合聚合函数来实现这个需求,不用重复关联三张表,这样既简洁又高效。
直接修改你原有的SQL语句,新增email_PLA列即可:
SELECT avg_salary.id, COUNT(CASE WHEN person.salary::numeric > avg_salary.avg THEN emails.message_from END) AS email_PGA, COUNT(CASE WHEN person.salary::numeric < avg_salary.avg THEN emails.message_from END) AS email_PLA FROM avg_salary, person, emails WHERE person.works_in = avg_salary.id AND person.email_address = emails.message_from GROUP BY avg_salary.id
原理说明:
CASE WHEN会根据条件返回对应值:当工资大于平均时,返回emails.message_from(非NULL值),否则返回NULL;COUNT()函数会自动忽略NULL值,这样就精准统计出了符合条件的邮件数量。- 你也可以用
SUM()替代COUNT(),写法是SUM(CASE WHEN ... THEN 1 ELSE 0 END),效果完全一致,看你个人书写习惯选择就行。 - 另外建议把老式的逗号关联写法改成
JOIN语法,可读性会更好,优化后的写法如下:
SELECT a.id, COUNT(CASE WHEN p.salary::numeric > a.avg THEN e.message_from END) AS email_PGA, COUNT(CASE WHEN p.salary::numeric < a.avg THEN e.message_from END) AS email_PLA FROM avg_salary a JOIN person p ON p.works_in = a.id JOIN emails e ON p.email_address = e.message_from GROUP BY a.id
这样代码结构更清晰,也符合现代SQL的书写规范。
内容的提问来源于stack exchange,提问作者Abhishek Chakraborty
相关产品推荐
相关产品推荐

