sql >> Base de Datos >  >> RDS >> PostgreSQL

SELECT COUNT(*) - devuelve 0 junto con campos agrupados si no hay filas coincidentes

¿Imposible? Desafío aceptado. :)

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;

Esto le dará exactamente lo que estás pidiendo. Si employee y department no son enteros, se convierten al tipo coincidente.

Por comentario de @ypercube:count() debe estar en una columna no nula de items , entonces obtenemos 0 para criterios inexistentes, no 1 .

Además, obtenga criterios adicionales en LEFT JOIN condición (i.available en este caso), para no excluir criterios inexistentes.

Rendimiento

Abordar una pregunta adicional en un comentario.
Esto debería funcionar muy bien. Con listas más largas de criterios, (LEFT) JOIN es probablemente el método más rápido.

Si lo necesita lo más rápido posible, asegúrese de crear una multicolumn índice como:

CREATE INDEX items_some_name_idx ON items (employee, department);

Si (employee, department) debe ser la PRIMARY KEY o deberías tener un UNIQUE restricción en las dos columnas, eso también funcionaría.