【问题标题】:SQL Query Count - Join two tables and get a count even if it is 0SQL Query Count - 加入两个表并得到一个计数,即使它是 0
【发布时间】:2015-02-14 23:04:25
【问题描述】:

好的,现在正在处理 SQL 2012 中的查询以连接两个表并获得计数。计数是与主要公司关联的公司数量。此列表存在于同一个表 Contact 中,并且它们都连接在一起,因为主要公司的 ID 在辅助公司中列为 CompanyID。如果主服务器至少有 1 个辅助服务器,我可以获得计数,但如果主服务器没有辅助服务器,我似乎无法计数,我需要显示 0 值。这是我的 SQL 查询:

SELECT c.ID, c.Company, c.Category, COUNT(c1.ID) AS Secondaries
FROM Contact AS c INNER JOIN Contact AS c1 ON c.ID = c1.CompanyId
WHERE (c.MemberType = 'ORG_M') AND (c1.MemberType = 'ORG_M')
GROUP BY c.ID, c.Company, c.Category

执行此操作时,我会返回以下信息:

ID  Company       Category      Count
1   Company 1     RS_1          1
2   Company 2     RS_1          1
3   Company 3     RS_1          1
4   Company 4     RS_1          1

我缺少的是 0 值,如果公司存在于公司表中但没有与之关联的二级公司。我怎么得到它?

【问题讨论】:

  • INNER JOIN 更改为LEFT JOIN 应该会覆盖它。

标签: sql sql-server join count


【解决方案1】:

改用outer join 并将where 条件移动到join

SELECT c.ID, c.Company, c.Category, COUNT(c1.ID) AS Secondaries
FROM Contact AS c
    LEFT JOIN Contact AS c1 ON c.ID = c1.CompanyId AND c1.MemberType = 'ORG_M'
WHERE c.MemberType = 'ORG_M'
GROUP BY c.ID, c.Company, c.Category

【讨论】:

  • 这可能也有用...自从我使用 SQL Server 以来已经有一段时间了。如果外部表中没有记录,COUNT(c1.ID) 是否会计算为 0?
  • @evanv -- 这是正确的 -- 这是一个简单的小提琴演示:sqlfiddle.com/#!2/ea8147/1 -- 另外,请注意在您的回答中,您需要将 c1.MemberType = 'ORG_M' 移动到 join 而不是where 标准。照原样,它将否定outer join
  • 那么同意。我会改变我的。
  • 谢谢。我曾尝试过左连接,但从未想过将 c1 移到 join 语句的位置。现在看来这已经奏效了。
  • 我可能谈得太早了。在进行此更改之前,我提取了 396 条记录,但只有具有辅助记录的记录没有被忽略,因为它被认为是空值。现在我已经做出了这个改变,我有超过 4000 条记录,但问题是这会选择没有公司与之关联的二级服务器。现在出现的这些二级公司应该在原始主要公司(它们是)的计数中,但现在又被计算在内。关于如何去除这部分的任何想法?
猜你喜欢
  • 1970-01-01
  • 2020-11-25
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多