2 votes

requête de comptage sql avec l'instruction case

Je dois exécuter une requête à partir de trois tables : avg_salary, person et emails. Cette simple requête sql fonctionne bien.

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

Mais je veux ajouter une autre colonne email_PLA avec la condition que lorsque person.salary::numeric < avg_salary.avg . Je peux le faire en joignant à nouveau l'ensemble de la requête. Mais je veux utiliser CASE dans cette situation. Et même après avoir essayé tant de fois, je n'arrive pas à obtenir la bonne syntaxe.

1voto

AaronHolland Points 131

Je suppose que vous avez besoin d'un autre compte ? Vous auriez besoin de quelque chose comme :

SUM(CASE WHEN (person.salary::numeric < avg_salary.avg) THEN 1 ELSE 0 END) AS email_PGA

1voto

Yogesh Sharma Points 29348

Vous pouvez faire conditionnel agrégation en utilisant le cas expression et utilisez toujours des JOIN syntaxe

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;

0voto

Sergio Rivas Points 373

Si vous avez besoin de différentes colonnes pour des conditions spécifiques, vous devez effectuer différentes requêtes SQL.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X