【问题标题】:Join count as a column in the sql query加入计数作为 sql 查询中的列
【发布时间】:2013-10-04 06:45:01
【问题描述】:

我有两张表 Business 和 BusinessCat。我需要一个 MSSQL 查询,它会得到以下结果:

ID | CategoryName | RecordCount
1  | Local        | 3
2  | National     | 1
3  | International| 2
4  | Other        | 0

我需要计算每个类别中有多少作为另一列。

业务表如下所示:

ID | Category | BusinessName
1  | 3        | Blackstone, Inc.
2  | 2        | Pet Smart
3  | 1        | John Doe
4  | 3        | Best Buy
5  | 1        | Sams Treats
6  | 1        | Eastcoast Tattoo

BusinessCat 表如下所示:

ID | CategoryName
1  | Local
2  | National
3  | International
4  | Other

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:
    SELECT CN.ID, CN.CategoryName, ISNULL(Count(B.ID), 0) AS RecordCount
    FROM Business B
    RIGHT JOIN BusinessCat CN
    ON B.Category = CN.ID
    GROUP BY CN.ID, CN.CategoryName
    

    SELECT CN.ID, CN.CategoryName,
        (SELECT COUNT(*) FROM Business B WHERE B.Category = CN.ID) AS RecordCount
    FROM BusinessCat CN
    

    检查哪个查询更快。

    【讨论】:

    • 第一个不会返回业务表中有 0 个条目的行,但是第二个会:) 在我的解决方案中也出错了..
    • @PrzemyslawKruglej:为什么它不返回任何东西?有一个左连接。您的解决方案实际上是使用 INNER JOIN。他对 Business.ID 进行了 ISNULL 检查。它应该完全有效。
    • @Ellesedil 不,这无济于事 - 看看我在说什么:sqlfiddle.com/#!3/e8196/5
    • @PrzemyslawKruglej:啊,表格的顺序不对。或者,它应该是一个正确的连接。 sqlfiddle.com/#!3/e8196/8
    • Right, RIGHT join :) 没看到,还以为还有问题。
    【解决方案2】:

    你可以试试:

    select bc.id, bc.cat_name, count(b.cat)
     from Business b (nolock)
    inner join businesscat bc (nolock)
    on b.cat=bc.id
    group by bc.id, bc.cat_name
    

    【讨论】:

      【解决方案3】:

      你需要一个LEFT OUTER JOIN + Group By + Count

      SELECT bc.ID, bc.CategoryName, RecordCount = COUNT(b.ID)
      FROM BusinessCat bc LEFT OUTER JOIN Business b
          ON bc.ID = b.Category
      GROUP BY bc.ID, bc.CategoryName
      

      Demonstration

      【讨论】:

      • 这实际上是错误的(我的也是) - 您的查询返回类别 4 的 1,它应该返回 0,因为业务表中没有与该类别相关的行。
      • @PrzemyslawKruglej:哎呀,你说得对,谢谢。将其从 COUNT(*) 更改为 COUNT(b.ID)
      • @tim 你是怎么做出那个按钮的??
      • @Dhaval:使用<kbd>[link-text](url)</kbd>kbd 是键盘的快捷键,看起来像一个按钮。
      【解决方案4】:

      你需要一个左/右连接:

      SELECT CN.ID, CN.CategoryName, isnull(Count(B.ID),0) RecCount
      FROM Business B
      RIGHT JOIN BusinessCat CN
                    ON B.Category = CN.ID
      GROUP BY CN.ID, CN.CategoryName
      

      【讨论】:

        【解决方案5】:

        嗯,弄错了,应该是(就像其他人说的):

        SELECT bc.id, bc.categoryname, COUNT(b.id)
          FROM businesscat bc LEFT JOIN business b ON (bc.id = b.category)
        GROUP BY bc.id, bc.categoryname
        ;
        

        【讨论】:

          【解决方案6】:
          select
                BC.ID,
                BC.CategoryName,
                coalesce( count(B.ID), 0 ) as RecordCount
             from
                BusinessCat BC
                   LEFT JOIN Business B
                      on BC.ID = B.Category
             group by
                BC.ID,
                BC.CategoryName
             ORDER BY
                BC.ID
          

          您需要一个 LEFT-JOIN 到业务类别表,以允许一个没有记录的条目继续显示在最终列表中。

          【讨论】:

          • 我不明白为什么会有反对票。 COALESCE 吓到人了吗?
          • 我无法让它工作,它一直要求我使用 Group By 而不是 Order By。
          • @kcray:哈,我都没注意到。
          • @Ellesedil,对不起,我不在,错过了小组。至于为什么其他人如此公然否决答案的上下文,只是因为我脑筋急转弯,我对他们有其他看法。这个会得到你想要的东西
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-20
          • 1970-01-01
          • 1970-01-01
          • 2013-09-11
          • 2018-09-30
          相关资源
          最近更新 更多