PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

SELECT COUNT(*) - връща 0 заедно с групираните полета, ако няма съответстващи редове

Невъзможно? Предизвикателството е прието. :)

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;

Това ще ви даде точно това, което питаш. Ако employee и department не са цяло число, преобразуват се в съответстващия тип.

Според коментар от @ypercube:count() трябва да бъде в ненулева колона от items , така че получаваме 0 за несъществуващи критерии, а не 1 .

Освен това изтеглете допълнителни критерии в LEFT JOIN състояние (i.available в този случай), така че да не изключвате несъществуващи критерии.

Ефективност

Адресиране на допълнителен въпрос в коментар.
Това трябва да се представи много добре. С по-дълги списъци с критерии, (LEFT) JOIN е може би най-бързият метод.

Ако имате нужда от него възможно най-бързо, не забравяйте да създадете мултиколона индекс като:

CREATE INDEX items_some_name_idx ON items (employee, department);

Ако (employee, department) трябва да бъде PRIMARY KEY или трябва да имате UNIQUE ограничение върху двете колони, това също би свършило работа.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL зададено поле на JSON обект в JSON масив

  2. Архивиране на дизайна на PostgreSQL база данни - без данни

  3. Postgresql COPY CSV ERROR:допълнителни данни след последната очаквана колона

  4. Entity Framework Core - ефективен начин за актуализиране на обект, който има деца въз основа на JSON представяне на обект, предаван чрез уеб API

  5. Postgresql поддържа ли lookbehind regexp?