Как вернуть значение нулевого значения в счетчик запросов в MS Access? - PullRequest
0 голосов
/ 21 ноября 2018

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

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

Opening Types

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

SQL Results

Вот копия моего 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;

Я попытался использовать различные типы внешнего объединения без удачи.

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

Я новичок в SQLПожалуйста, не используйте короткие руки.

Пример базы данных

Ответы [ 2 ]

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

После моего комментария, если у вас есть отдельная таблица всех возможных типов открытий (например, tblOpeningTypes с первичным ключом id), тогда я бы предложил следующее:

select
    ot.id, nz(t.cnt, 0) as positions
from
    tblopeningtypes ot
    left join
    (
        select o.fk_openingtypeid, count(o.position) as cnt
        from tblopening o inner join tblopeningcity oc on o.city = oc.openingcityid
        where
            o.position = "Flex Officer" and
            o.closed = no and 
            oc.openingcity in ("Livermore", "Pleasanton")
        group by o.fk_openingtypeid
    ) t
    on ot.id = t.fk_openingtypeid
0 голосов
/ 21 ноября 2018

Предполагая, что у вас есть таблица tblOpeningType, включите ее в запрос и используйте левое соединение, которое показывает все записи из левой таблицы.Кроме того, поскольку вы применяете предложение where к правой таблице, это разрушит эффект LEFT JOIN.Поэтому я использую суб-выбор.

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

Когда две таблицы объединены, INNER JOIN дает результаты, когда в обеих таблицах есть соответствующая запись.LEFT JOIN дает результаты для всех записей левой таблицы, а когда записи отсутствуют в правой таблице, соответствующие столбцы результатов заполняются значением NULL.

Пример:

Person              City
------              ----
Id Name CityId      Id Name
-- ---- ------      -- -------
1  Joe  10          10 Atlanta
2  Sue  10          20 Boston
3  Tim  30          30 Chicago

A INNERЗапрос JOIN:

SELECT c.Id, c.Name AS City, p.Name AS Person
FROM City c INNER JOIN Person p ON c.Id = p.CityId

Результат:

Id  City     Person
--  -------  ------
10  Atlanta  Joe
10  Atlanta  Sue
30  Chicago  Tim

С ЛЕВЫМ СОЕДИНЕНИЕМ (в этом запросе указана таблица слева):

SELECT c.Id, c.Name AS City, p.Name AS Person
FROM City c LEFT JOIN Person p ON c.Id = p.CityId

Результат:

Id  City     Person
--  -------  ------
10  Atlanta  Joe
10  Atlanta  Sue
20  Boston   <NULL>
30  Chicago  Tim

Теперь ваш запрос показывает дополнительную сложность.Это говорит WHERE tblOpening.Position = "Flex Officer" ....Это запрещает tblOpening.Position быть NULL в наборе результатов (даже если столбец отсутствует в списке выбора), поскольку LEFT JOIN с tblOpeningType потребует.Поэтому я использую SELECT с этим предложением WHERE в качестве дополнительного выбора.Подвыбор - это просто команда SELECT, заключенная в скобки (SELECT ...) X с заданным псевдонимом (X), которая используется как таблица в окружающем запросе.

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