【问题标题】:How do I make query return 0 when no records match in Access 2013?当 Access 2013 中没有记录匹配时,如何使查询返回 0?
【发布时间】:2015-10-20 10:29:19
【问题描述】:

我的 Access 2013 数据库中有一个查询,它计算符合特定条件的记录数量。但是,在某些情况下,没有记录将匹配并且查询不返回任何内容。当我在计算中使用此值时,这会导致问题。请从下面我的查询中找到 SQL 代码。

SELECT [Main Database].Renewal,
[Main Database].[2014/15 - Permission to Review],
Count(Main Database].[2014/15 - Permission to Review]) AS [CountOf2014/15 - Permission to Review]
FROM [Main Database]
GROUP BY [Main Database].Renewal, [Main Database].[2014/15 - Permission to Review]
HAVING ((([Main Database].Renewal) Like "**/05/****") AND (([Main Database].[2014/15 - Permission to Review])="Yes"));

我尝试过使用 Nz 函数和 IIF(IsNull([])),但是这些似乎都不起作用。

我做错了什么或有其他方法来实现我想要的吗?

编辑 - 带有子查询的新代码

SELECT COUNT (*) AS iniSumNov
FROM (
SELECT [Main Database].Renewal, [Main Database].[2014/15 - Initial Contact], 
Count([Main Database].[2014/15 - Initial Contact])
AS [CountOf2014/15 - Initial Contact]
FROM [Main Database]
GROUP BY [Main Database].Renewal, [Main Database].[2014/15 - Initial Contact]
HAVING ((([Main Database].Renewal) Like "**/11/****") AND (([Main Database].[2014/15 - Initial Contact])="Yes"))
);

【问题讨论】:

    标签: sql database ms-access ms-access-2013


    【解决方案1】:

    在子查询上使用 COUNT(*):

    SELECT COUNT(*) as NbRecords
    FROM (
        SELECT ...whatever you need
         )
    

    如果子查询为空,则主查询将返回 NbRecords = 0

    【讨论】:

    • 我已经尝试使用上面的建议,但是它出现了一条错误消息,指出“SELECT 语句包含拼写错误的保留字或参数名称”。
    • 至少你得到了一个明确的错误信息,告诉你在哪里看,现在:-)
    • 在使用上述解决方案时,如果没有匹配的记录,则返回 0。但是,当有多个具有相同信息的记录时,它会将它们视为 1,因此计数不正确。有什么办法可以避免吗?
    • 这可能意味着子查询返回单行,或者您应该在子查询中添加一个主键以避免 Access 执行自动“不同”,这似乎有时会在您有重复行时发生。最终尝试向子查询添加 DISTINCTROW 选项?
    • 我尝试将 DISTINCTROW 和 ALL 添加到子查询中,但都没有产生任何影响。我已经使用子查询将我的新代码添加到原始问题中,这样您就可以看到我当前使用的内容。
    【解决方案2】:

    使用这个..

     SELECT A.Renewal as Renewal ,
     A.[2014/15 - Permission to Review] as Permission_to_Review,
     IIF(isNull(Count(A.[2014/15 - Permission to Review])),0,Count(A.[2014/15 - Permission to Review])) AS count_Permission_to_Review 
     FROM [Main Database] A
     where (((A.Renewal) Like "**/05/****") AND ((A.[2014/15 - Permission to Review])="Yes")) 
     GROUP BY A.Renewal, A.[2014/15 - Permission to Review] 
    ;
    

    【讨论】:

    • 感谢您的快速回复!我已经验证了建议的代码,但是它返回一个错误,说“查询表达式中的语法错误(缺少运算符)。有什么建议吗?
    • where 后的双倍空格? IS NULL 之后的另一个空格?在IIf() 中使用IsNull() 可能会更好
    • 删除了空格并使用了别名..现在检查一下
    • 不幸的是,查询仍然没有返回任何内容。
    • 你能用表结构发布你的表数据吗?
    猜你喜欢
    • 2022-10-17
    • 2021-01-07
    • 2022-01-15
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多