PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

SELECT COUNT(*) - renvoie 0 avec les champs groupés s'il n'y a pas de lignes correspondantes

Pas possible? Défi accepté. :)

WITH x(employee, department) AS (
   VALUES
    (1::int, 2::int)
   ,(3, 4)
   ,(5, 6)
    -- ... more combinations
   )
SELECT x.employee, x.department, count(i.employee) AS ct
FROM   x
LEFT   JOIN items i ON i.employee = x.employee
                   AND i.department = x.department
                   AND i.available
GROUP  BY x.employee, x.department;

Cela vous donnera exactement ce que vous demandez. Si employee et department ne sont pas entiers, transtypés dans le type correspondant.

Par commentaire de @ypercube :count() doit être sur une colonne non nulle de items , nous obtenons donc 0 pour les critères inexistants, pas 1 .

Aussi, extrayez des critères supplémentaires dans le LEFT JOIN état (i.available dans ce cas), vous n'excluez donc pas les critères inexistants.

Performances

Répondre à une question supplémentaire en commentaire.
Cela devrait très bien fonctionner. Avec des listes de critères plus longues, (LEFT) JOIN est probablement la méthode la plus rapide.

Si vous en avez besoin le plus rapidement possible, assurez-vous de créer une multicolumn index comme :

CREATE INDEX items_some_name_idx ON items (employee, department);

Si (employee, department) devrait être la PRIMARY KEY ou vous devriez avoir un UNIQUE contrainte sur les deux colonnes, cela ferait aussi l'affaire.