PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

SELECT COUNT(*) - gibt 0 zusammen mit gruppierten Feldern zurück, wenn es keine übereinstimmenden Zeilen gibt

Nicht möglich? Herausforderung angenommen. :)

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;

Dadurch erhalten Sie genau wonach du fragst. Wenn employee und department sind keine Ganzzahlen, werden in den passenden Typ umgewandelt.

Per Kommentar von @ypercube:count() muss sich in einer Nicht-Null-Spalte von items befinden , also erhalten wir 0 für nicht vorhandene Kriterien nicht 1 .

Ziehen Sie auch zusätzliche Kriterien in den LEFT JOIN Bedingung (i.available in diesem Fall), sodass Sie keine nicht vorhandenen Kriterien ausschließen.

Leistung

Beantwortung zusätzlicher Fragen im Kommentar.
Dies sollte sehr gut funktionieren. Bei längeren Kriterienlisten (LEFT) JOIN ist wahrscheinlich die schnellste Methode.

Wenn Sie es so schnell wie möglich brauchen, stellen Sie sicher, dass Sie eine Multicolumn erstellen Index wie:

CREATE INDEX items_some_name_idx ON items (employee, department);

Wenn (employee, department) sollte der PRIMARY KEY sein oder Sie sollten einen UNIQUE haben Beschränkung auf die beiden Spalten, das würde auch funktionieren.