如果没有找到行,如何使SELECT COUNT(*)在GROUP BY查询中返回0

时间:2012-03-15 19:52:40

标签: tsql

我正在寻找一个抓取字段计数并将其组合在一起的查询,但我希望它返回所有值,即使计数为0。

这就是我所拥有的:

SELECT COUNT(*)
      ,PMI
  FROM Items AS AA
  JOIN Headers AS BB
  ON AA.DocID = BB.ID
 WHERE (DocDate = CAST(CONVERT(varchar(8), GETDATE() - 1, 1) AS datetime))
   AND PMI != ''
GROUP BY PMI

以下是我想看到的内容:

COUNT     PMI
    1     900330
    5     900702
    0     900550
    0     900331

但这是我得到的:

COUNT     PMI
    1     900330
    5     900702

我以前从来没有写过一个查询来完成这个,所以如果这是微不足道我会道歉。

编辑:我意识到这些表格不包含我要查找的所有项目。我有一个名为'lookup'的查找表,其中包含我希望查询计数的所有这些项目。

编辑2:谢谢大家。通过创建视图并使用查找表和外部联接使其工作。诀窍很奇妙。

2 个答案:

答案 0 :(得分:1)

您正在使用INNER JOIN,如果匹配的话,则不会返回任何行。您应该使用OUTER JOIN代替。

假设PMI上有Items

SELECT PMI, COUNT(BB.ID)
  FROM Items AS AA
  LEFT JOIN Headers AS BB
  ON AA.DocID = BB.ID
 WHERE (DocDate = CAST(CONVERT(varchar(8), GETDATE() - 1, 1) AS datetime))
   AND PMI != ''
GROUP BY PMI

答案 1 :(得分:1)

简单回答是包装整个SQL查询并在COUNT列上添加SUM。

SELECT SUM(yourCountField), someOtherField1, someOtherField2
FROM
(
    SELECT COUNT(yourCountField), someOtherField1, someOtherField2
    FROM ....
)
GROUP BY someOtherField1, someOtherField2