PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

SELECT COUNT(*) - zwraca 0 wraz z pogrupowanymi polami, jeśli nie ma pasujących wierszy

Niemożliwe? Wyzwanie przyjęte. :)

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;

Dzięki temu uzyskasz dokładnie o co prosisz. Jeśli employee i department nie są liczbami całkowitymi, rzutuj na pasujący typ.

Każdy komentarz z @ypercube:count() musi znajdować się w niepustej kolumnie items , więc otrzymujemy 0 dla nieistniejących kryteriów, a nie 1 .

Przeciągnij również dodatkowe kryteria do LEFT JOIN warunek (i.available w tym przypadku), więc nie wykluczasz nieistniejących kryteriów.

Wydajność

Adresowanie dodatkowego pytania w komentarzu.
To powinno działać bardzo dobrze. Przy dłuższych listach kryteriów (LEFT) JOIN jest prawdopodobnie najszybszą metodą.

Jeśli potrzebujesz go tak szybko, jak to możliwe, utwórz wielokolumnę indeks jak:

CREATE INDEX items_some_name_idx ON items (employee, department);

Jeśli (employee, department) powinien być PRIMARY KEY lub powinieneś mieć UNIQUE ograniczenie na dwie kolumny, to też załatwiłoby sprawę.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak sprawdzić, czy wiersz istnieje w procedurze składowanej PostgreSQL?

  2. Błąd PG nie mógł połączyć się z serwerem:Połączenie odrzucone Czy serwer działa na porcie 5432?

  3. Różnica między INSERT a COPY

  4. Iterowanie po liczbach całkowitych [] w PL/pgSQL

  5. Postgresql zmienia typ kolumny z int na UUID