Как вернуть значение Zero для нулевого значения в Count Query в MS-Access? - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть два типа открытия, для которых я пытаюсь получить значения в моем запросе в MS-Access. Как видно на фото ниже. Когда оба этих значения присутствуют в моих результатах, они выдают количество позиций для каждого.

Opening Types

Когда один из типов открытия вообще не был выбран в соответствующей таблице, он не отображается при подсчете запросов, как показано ниже.

Only 1 category displaying

Мой SQL выглядит следующим образом

SELECT tblOpening.fk_OpeningTypeId
    ,Count(tblOpening.Position) AS CountOfPosition
FROM tblOpeningCity
INNER JOIN tblOpening ON tblOpeningCity.OpeningCityID = tblOpening.City
WHERE (
        ((tblOpening.Position) = "Flex Officer")
        AND ((tblOpening.Closed) = No)
        AND (
            (tblOpeningCity.OpeningCity) = "Livermore"
            OR (tblOpeningCity.OpeningCity) = "Pleasanton"
            )
        )
GROUP BY tblOpening.fk_OpeningTypeId;

Я пытался изменить соединение, и не повезло. Любая помощь будет оценена.

Вот некоторые примеры данных, которые похожи на то, что будет использовать моя база данных.

https://drive.google.com/open?id=1X1W-wctcP7SiYIOWx4VYTOh03zddF81r

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Просто добавьте ваше условие с помощью выражения IIF() и добавьте вокруг него Sum():

SELECT tblOpening.fk_OpeningTypeId
,Sum(IIF(tblOpening.Position = "YourCondition", 1, 0)) AS CountOfPosition
FROM tblOpeningCity
INNER JOIN tblOpening ON tblOpeningCity.OpeningCityID = tblOpening.City
WHERE (
    ((tblOpening.Position) = "Flex Officer")
    AND ((tblOpening.Closed) = No)
    AND (
        (tblOpeningCity.OpeningCity) = "Livermore"
        OR (tblOpeningCity.OpeningCity) = "Pleasanton"
        )
    )
GROUP BY tblOpening.fk_OpeningTypeId;
0 голосов
/ 10 ноября 2018

Вы можете выполнить то, что вы хотите, используя LEFT JOIN. MS Access затрудняет учет различий, поэтому он, вероятно, делает то, что вам нужно:

SELECT o.fk_OpeningTypeId, Count(oc.OpeningCityID) AS CountOfPosition
FROM tblOpening as o LEFT JOIN
     (SELECT oc.*
      FROM tblOpeningCity oc
      WHERE oc.OpeningCity IN ("Livermore", "Pleasanton")
     ) as oc
     ON oc.OpeningCityID = o.City
WHERE o.Position = "Flex Officer" AND
      o.Closed = No
GROUP BY o.fk_OpeningTypeId;

Возможно, фильтры на o удаляют то, что вы хотите. Если это так, то условное агрегирование исправит это:

SELECT o.fk_OpeningTypeId, 
       SUM(IIF(oc.OpeningCityID IS NOT NULL AND
               o.Position = "Flex Officer" AND
               o.Closed = No, 1, 0)
          ) AS CountOfPosition
FROM tblOpening as o LEFT JOIN
     (SELECT oc.*
      FROM tblOpeningCity oc
      WHERE oc.OpeningCity IN ("Livermore", "Pleasanton")
     ) as oc
     ON oc.OpeningCityID = o.City
GROUP BY o.fk_OpeningTypeId;

Образец базы данных Access

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...