【问题标题】:SQL count show 0 if no rows including where condition如果没有包含 where 条件的行,SQL 计数显示 0
【发布时间】:2021-01-15 06:50:39
【问题描述】:

我正在执行COUNT,但当结果中没有行时无法获得值 0。

如果我删除 where 条件:

AND documentstats.OPENINGDATE >= '2021-01-01T00: 00: 00.000'

它工作正常,当结果中没有行时我得到值 0。

当我的计数中未找到任何行时,我正在寻找在 NumberOfViews 列中返回值 0 的选项。

谁能帮帮我?

SELECT 
    customertodocument.DocId,
    COUNT (documentstats.DocId) AS NumberOfViews
FROM 
    customertodocument 
LEFT JOIN 
    documentstats ON customertodocument.DocId = documentstats.DocId 
                  AND customertodocument.customerId = documentstats.customerId
WHERE 
    customertodocument.customerId = '1111'
    AND documentstats.openingdate >= '2021-01-01T00:00:00.000'
GROUP BY 
    customertodocument.DocId
ORDER BY 
    NumberOfViews ASC

【问题讨论】:

标签: sql count


【解决方案1】:

我的猜测是数据中没有同时满足这两个条件的记录。您正在按 customertodocument.DocId 进行分组,但如果在使用 WHERE 子句过滤后不存在 customertodocument.DocID 的值,则聚合将没有任何分组依据,您将得不到任何结果。您可以通过运行以下查询来测试:

SELECT *
FROM customertodocument
LEFT JOIN documentstats on customertodocument.DocId = documentstats.DocId and customertodocument.customerId = documentstats.customerId
WHERE customertodocument.customerId = '1111' AND documentstats.openingdate >= '2021-01-01T00:00:00.000'

【讨论】:

  • 感谢您的回复。我在执行 sql 查询时得到了正确的结果,所以我知道数据中有几条记录同时满足这两个条件。我唯一想念的是在未找到任何行时在 NumberOfViews 列中返回值 0 的选项。
【解决方案2】:

您的WHERE 条件不返回任何内容,因此您没有获得任何记录。在 select 子句中单独计数可以给你 0 但你有一列然后计数所以你没有得到任何记录

如果未找到匹配记录,您期望 customertodocument.DocId 中的值是多少。

如果您从 select 子句中删除 customertodocument.DocId,只在 select 子句中保留 count 并删除 GROUP BY 子句,您可以获得 0 计数

【讨论】:

  • 感谢您的回复。我不能没有customertodocument.DocId,因为我需要查看customertodocument 中的所有帖子以及DocId 在documentstats 中出现的次数。在 customertodocument.DocId 我希望来自 customertodocument 表的 docID。如果 documentstats 表中没有 DocId 的结果,我希望 NumberOfViews 列中为 0。
【解决方案3】:

WHERE 子句中的第二个条件是过滤掉所有不匹配的内容。因为你有一个显式的GROUP BY,所以如果FROM 子句没有行,查询将不会返回任何行。

如果您想要0 的计数,则将条件移至LEFT JOINON 子句。注意:second 表的条件放在ON 子句中。

查询应如下所示:

SELECT cd.DocId, COUNT(ds.DocId) AS NumberOfViews
FROM customertodocument cd LEFT JOIN
     documentstats ds
     ON cd.DocId = ds.DocId AND
        cd.customerId = ds.customerId AND
        ds.openingdate >= '2021-01-01'
WHERE ds.customerId = 1111
GROUP BY cd.DocId
ORDER BY NumberOfViews ASC;

注意事项:

  • 表别名使查询更易于编写和阅读。
  • customerId 看起来像一个数字。如果是,那么比较应该是一个数字。如果 id 确实是一个字符串,请将单引号放回。
  • 您有一个日期常数。不需要包括时间。没有真正的危害,只是它会使查询变得混乱。

【讨论】:

    猜你喜欢
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    相关资源
    最近更新 更多