【问题标题】:SQL Server Count on a grouped bySQL Server 计数分组依据
【发布时间】:2011-06-09 15:59:58
【问题描述】:

我有 3 张桌子。我想按 item.name 分组并计算可以在 idetail 中找到的次数。此查询只计算所有行而不是按行分组。

有人知道怎么解决吗?

SELECT i.name, COUNT(i.name)
FROM item AS i
INNER JOIN item_category AS ic ON i.i_category_id = ic.ic_id
INNER JOIN idetail AS id ON ic.ic_id = id.id_category_id
WHERE ic.ic_id = 1002
GROUP BY i.name

【问题讨论】:

  • 一定有问题,或者我遗漏了一些东西。 This query only counts all rows not the grouped by rows. 先生,据我所知,此脚本通过分组计算 COUNT(*),并且正确执行,即结果必须是每个 item.name 的数字,而不是所有行的计数。你实际上得到了什么输出?
  • 我对你真正想要的东西也有点困惑——你能举个例子吗?也许您打算使用SELECT COUNT(DISTINCT i.name) . . .SELECT i.name, COUNT(id.id_id) FROM . . . LEFT JOIN idetail id . . . GROUP BY i.name 之类的东西?

标签: sql sql-server count group-by


【解决方案1】:

这就是你想要的:

select x.name
     , count(*) as cntNames
     , sum(x.cntDetails) as cntDetails
  from (
        SELECT i.name, COUNT(*) as cntDetails
          FROM item AS i
         INNER JOIN item_category AS ic ON i.i_category_id = ic.ic_id
         INNER JOIN idetail AS id ON ic.ic_id = id.id_category_id
         WHERE ic.ic_id = 1002
          -- NOTICE THE 2nd Value in the group by!
         GROUP BY i.name,id.id_category_id
       ) x
  group by name

【讨论】:

    【解决方案2】:
    Select  Count(*)
    From    (
                Select i.name, Count(i.name)
                From item As I
                    Join item_category As ic
                        On ic.ic_id = i.category_id
                    Join idetail as ID
                        On ID.id_category_id = ic.ic_id
                Where ic.ic_id = 1002
                Group By i.name
                ) As Z
    

    如果您想要所有三列并且您使用的是 SQL Server 2005+

    With Items As
        (
        Select I.name, Count(i.name) As ItemCount
        From item As I
            Join item_category As ic
                On ic.ic_id = i.category_id
            Join idetail as ID
                On ID.id_category_id = ic.ic_id
        Where ic.ic_id = 1002
        Group By i.name
        )
    Select Name, ItemCount
        ,   (
            Select Count(*)
            From Items
            ) As OverallCount
    From Items  
    

    另一个更简单的版本,如果您使用的是 SQL Server 2005+。

    Select i.name
        , Count(i.name) As CountByName
        , Count(*) Over() As TotalCount
    From item As I
        Join item_category As ic
            On ic.ic_id = i.category_id
        Join idetail as ID
            On ID.id_category_id = ic.ic_id
    Where ic.ic_id = 1002
    Group By i.name
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-11
      • 2011-02-20
      • 2019-05-11
      • 2021-03-28
      • 1970-01-01
      相关资源
      最近更新 更多