Как сделать, чтобы SELECT COUNT (*) возвращал 0 в запросе GROUP BY, если строки не найдены - PullRequest
1 голос
/ 15 марта 2012

Я хочу написать запрос, который собирает счетчик поля и группирует его, но я хочу, чтобы он возвращал ВСЕ значения, даже если счетчик равен 0.

Вот что у меня есть:

SELECT COUNT(*)
      ,PMI
  FROM Items AS AA
  JOIN Headers AS BB
  ON AA.DocID = BB.ID
 WHERE (DocDate = CAST(CONVERT(varchar(8), GETDATE() - 1, 1) AS datetime))
   AND PMI != ''
GROUP BY PMI

Вот что я хочу увидеть:

COUNT     PMI
    1     900330
    5     900702
    0     900550
    0     900331

Но вот что я получаю:

COUNT     PMI
    1     900330
    5     900702

Мне никогда не приходилось писать запросчтобы сделать это раньше, поэтому я извиняюсь, если это тривиально.

РЕДАКТИРОВАТЬ: я понял, что эти таблицы не содержат все элементы, которые я ищу.У меня есть справочная таблица под названием «поиск», которая содержит все эти элементы, которые я хочу запросить для подсчета.

РЕДАКТИРОВАТЬ 2: Спасибо всем.Сделайте это, создав представление и используя таблицу поиска и внешнее соединение.Сделал трюк чудесно.

Ответы [ 2 ]

1 голос
/ 27 июня 2013

Простой ответ - обернуть весь SQL-запрос и добавить сумму в столбце COUNT.

SELECT SUM(yourCountField), someOtherField1, someOtherField2
FROM
(
    SELECT COUNT(yourCountField), someOtherField1, someOtherField2
    FROM ....
)
GROUP BY someOtherField1, someOtherField2
1 голос
/ 15 марта 2012

Вы используете INNER JOIN, который не возвращает строки, если совпадения совпадают. Вы должны использовать OUTER JOIN вместо.

Предполагается, что PMI включено Items:

SELECT PMI, COUNT(BB.ID)
  FROM Items AS AA
  LEFT JOIN Headers AS BB
  ON AA.DocID = BB.ID
 WHERE (DocDate = CAST(CONVERT(varchar(8), GETDATE() - 1, 1) AS datetime))
   AND PMI != ''
GROUP BY PMI
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...