【问题标题】:Count number of records returned by group by统计分组返回的记录数
【发布时间】:2011-07-06 00:59:56
【问题描述】:

如何统计group by query返回的记录数,

例如:

select count(*) 
from temptable
group by column_1, column_2, column_3, column_4

给我,

1
1
2

我需要把上面的记录数一下,得到 1+1+1 = 3。

【问题讨论】:

  • @LorenVS:但这会让我计算表中的记录数。发生分组后我需要记录数。
  • group by 不会改变行数。 1 + 1 + 2 (在您的示例中)将是表中的行数。你在找3吗?不同组的数量?
  • 另一种表述问题的方法:如何为给定查询选择不同分组级别的数量?
  • 用户提出问题的原因并不总是很明显,但我来到这里是因为我正在测试视图中的列是候选主键还是组合键。 "select count(distinct COLUMNNAME) from VIEWNAME" 超时,如果我能得到总数,group by 可以工作。

标签: sql-server tsql count group-by


【解决方案1】:

最简单的解决方案是使用派生表:

Select Count(*)
From    (
        Select ...
        From TempTable
        Group By column_1, column_2, column_3, column_4
        ) As Z

另一种解决方案是使用 Count Distinct:

Select ...
    , ( Select Count( Distinct column_1, column_2, column_3, column_4 )
        From TempTable ) As CountOfItems
From TempTable
Group By column_1, column_2, column_3, column_4

【讨论】:

  • 第一个答案也适用于 DB/2,但由于某种原因,它需要添加 AS TMP 才能工作(如添加 troutinator)
  • @Bjinse - 一些 DBMS 将要求所有派生表都有一个别名。他们都会接受它,因此包含它不会有什么坏处。我会把它添加到我的答案中。
【解决方案2】:

怎么样:

SELECT count(column_1)
FROM
    (SELECT * FROM temptable
    GROUP BY column_1, column_2, column_3, column_4) AS Records

【讨论】:

    【解决方案3】:

    你可以这样做:

    select sum(counts) total_records from (
        select count(*) as counts
        from temptable
        group by column_1, column_2, column_3, column_4
    ) as tmp
    

    【讨论】:

      【解决方案4】:

      您可以在一个查询中使用另一个 COUNT 上的 OVER 子句来完成这两项操作

      select
          count(*) RecordsPerGroup,
          COUNT(*) OVER () AS TotalRecords
      from temptable
      group by column_1, column_2, column_3, column_4
      

      【讨论】:

      • 我知道这是一个 SQL-Server 问题,但仅供参考:这在 DB/2 上不起作用(在我的情况下是在 IBM iSeries 上)。请参阅我在 Thomas 的回答中的评论
      • 我将如何回显该计数?
      • @McDanGarrett:对不起是什么意思?
      • 这个解决方案的缺点是它会多次给出答案(对于column_1, column_2, column_3, column_4 的每个组合)。这可能会也可能不会产生重大副作用,具体取决于您处理结果的方式。
      • 在我的情况下,使用 TOP(1) COUNT() OVER() 的查询性能很差。由于我只需要组数,我将其更改为 DISTINCT COUNT() OVER(),查询性能显着提高。
      【解决方案5】:

      我知道现在已经很晚了,但没有人建议这样做:

      select count ( distinct column_1, column_2, column_3, column_4) 
      from   temptable
      

      这至少在 Oracle 中有效——我目前没有其他数据库可以测试它,而且我对 T-Sql 和 MySQL 语法不太熟悉。

      另外,我不完全确定在解析器中这样做是否更有效,或者其他人的嵌套 select 语句的解决方案是否更好。但从编码的角度来看,我发现这个更优雅。

      【讨论】:

      • Thomas 将您的解决方案添加到他的回答中。反正。出于维护原因,我不建议这样做,其他解决方案要好得多。
      • @RăzvanFlaviusPanda 1. 为什么?其他解决方案有什么更好的地方?嵌套 SQL 更冗长,在我看来,更混乱且更难理解(因此在支持方面更难维护)。我知道您可能对其他方式有偏好,但这并不是“推荐”它而不是其他人偏好的理由。 Thomas 确实提出了类似的建议,是的,但他再次使嵌套 SQL 看起来好像是解决方案的必要部分,但事实并非如此。
      【解决方案6】:

      CTE 为我工作:

      with cte as (
        select 1 col1
        from temptable
        group by column_1
      )
      
      select COUNT(col1)
      from cte;
      

      【讨论】:

      • CTE = 公用表表达式
      【解决方案7】:

      在 PostgreSQL 中这对我有用:

      select count(count.counts) 
      from 
          (select count(*) as counts 
           from table 
           group by concept) as count;
      

      【讨论】:

        【解决方案8】:

        我试图在没有子查询的情况下达到同样的效果,并且能够获得如下所需的结果

        SELECT DISTINCT COUNT(*) OVER () AS TotalRecords
        FROM temptable
        GROUP BY column_1, column_2, column_3, column_4
        

        【讨论】:

          【解决方案9】:

          你能不能执行下面的代码。它在 Oracle 中工作。

          SELECT COUNT(COUNT(*))
          FROM temptable
          GROUP BY column_1, column_2, column_3, column_4
          

          【讨论】:

          • 无法在 sql-server 上的聚合内运行聚合。
          【解决方案10】:

          您也可以通过以下查询获得

          select column_group_by,count(*) as Coulm_name_to_be_displayed from Table group by Column;
          
          -- For example:
          select city,count(*) AS Count from people group by city
          

          【讨论】:

            【解决方案11】:

            试试这个查询:

            select top 1 TotalRows = count(*) over () 
            from yourTable
            group by column1, column2
            

            【讨论】:

              【解决方案12】:

              在 SQL Server 中使用 COUNT OVER (PARTITION BY {column to group by}) 分区函数怎么样?

              例如,如果您想按 ItemID 对产品销售进行分组,并且想要计算每个不同 ItemID 的计数,只需使用:

              SELECT
              {columns you want} ,
              COUNT(ItemID) OVER (PARTITION BY ItemID) as BandedItemCount ,
              {more columns you want}... ,
              FROM {MyTable}
              

              如果您使用这种方法,则可以将 GROUP BY 排除在图片之外——假设您想要返回整个列表(因为您可能会在需要知道要访问的项目的全部数量的地方报告条带)带而不必显示整个数据集,即 Reporting Services)。

              【讨论】:

              • BandedItemCount 究竟包含什么值?输出行之间有区别吗?提问者正在寻找不同分组级别的数量。
              【解决方案13】:

              以下为PrestoDb,其中 FirstField 可以有多个值:

              select *
                          , concat(cast(cast((ThirdTable.Total_Records_in_Group * 100 / ThirdTable.Total_Records_in_baseTable) as DECIMAL(5,2)) as varchar), '%') PERCENTage
              from 
              (
                  SELECT FirstTable.FirstField, FirstTable.SecondField, SecondTable.Total_Records_in_baseTable, count(*) Total_Records_in_Group
                  FROM BaseTable FirstTable
                  JOIN (
                          SELECT FK1, count(*) AS Total_Records_in_baseTable 
                          FROM BaseTable
                          GROUP BY FK1
                      ) SecondTable
                  ON FirstTable.FirstField = SecondTable.FK1
                  GROUP BY FirstTable.FirstField, FirstTable.SecondField, SecondTable.Total_Records_in_baseTable
                  ORDER BY FirstTable.FirstField, FirstTable.SecondField
              ) ThirdTable
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-11-16
                • 2020-10-19
                • 2021-10-19
                • 1970-01-01
                • 1970-01-01
                • 2020-09-02
                相关资源
                最近更新 更多