如何在MS Access的计数查询中返回零值?

时间:2018-11-20 22:45:43

标签: sql ms-access

我试图在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的新手,请不要使用空手。

Sample Database

2 个答案:

答案 0 :(得分:1)

假设您有一个表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

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(即使该列不在选择列表中),这与tblOpeningType的LEFT JOIN要求相同。因此,我将带有此WHERE子句的SELECT用作子选择。子选择只是一个带有给定别名((SELECT ...) X)的括在方括号X中的SELECT命令,其用法类似于周围查询中的表。

答案 1 :(得分:0)

在我的评论之后,假设您有一个所有可能的开门类型的单独表(例如,主键为tblOpeningTypes的{​​{1}}),那么我建议如下:

id