计算按组返回的记录数

Chr*_*ris 120 t-sql sql-server group-by count

如何通过查询计算组返回的记录数,

例如:

select count(*) 
from temptable
group by column_1, column_2, column_3, column_4
Run Code Online (Sandbox Code Playgroud)

给我,

1
1
2
Run Code Online (Sandbox Code Playgroud)

我需要计算上述记录,得到1 + 1 + 1 = 3.

gbn*_*gbn 154

您可以使用另一个COUNT上的OVER子句在一个查询中执行这两个操作

select
    count(*) RecordsPerGroup,
    COUNT(*) OVER () AS TotalRecords
from temptable
group by column_1, column_2, column_3, column_4
Run Code Online (Sandbox Code Playgroud)

  • 在我的情况下,使用 TOP(1) COUNT(*) OVER() 的查询性能很差。由于我只需要组的数量,因此我将其更改为 DISTINCT COUNT(*) OVER(),查询性能得到了显着提升。 (4认同)
  • 要仅返回记录数,请将选择顶部(1)计数(*)over()添加为.... (3认同)
  • 此解决方案的缺点是它多次为您提供答案(对于`column_1、column_2、column_3、column_4` 的每个组合)。这可能是也可能不是显着的副作用,具体取决于您处理结果的方式。 (2认同)

Tho*_*mas 61

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

Select Count(*)
From    (
        Select ...
        From TempTable
        Group By column_1, column_2, column_3, column_4
        ) As Z
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是使用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
Run Code Online (Sandbox Code Playgroud)

  • @Bjinse - 有些DBMS会要求所有派生表都有别名.他们都会接受它,所以包含它不会有害.我会把它添加到我的答案中. (4认同)

car*_*rse 24

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

select count ( distinct column_1, column_2, column_3, column_4) 
from   temptable
Run Code Online (Sandbox Code Playgroud)

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

另外,我不完全确定在解析器中以这种方式执行它是否更有效,或者是否其他人的嵌套select语句的解决方案更好.但是从编码的角度来看,我觉得这个更优雅.

  • 当然,如果你有一个HAVING条款,这不起作用:-) (2认同)
  • @RăzvanFlaviusPanda 1.为什么?其他解决方案有哪些更好的地方?嵌套 SQL 更加冗长,在我看来,更加混乱且难以理解(因此在支持意义上更难维护)。我知道您可能更喜欢其他方式,但这并不是“推荐”它而不是其他人的偏好的理由。是的,Thomas 确实提出了类似的建议,但他再次让嵌套 SQL 看起来像是解决方案的必要部分,但事实并非如此。 (2认同)

Man*_*ani 9

我试图在没有子查询的情况下实现相同的目标,并且能够获得如下所需的结果

SELECT DISTINCT COUNT(*) OVER () AS TotalRecords
FROM temptable
GROUP BY column_1, column_2, column_3, column_4
Run Code Online (Sandbox Code Playgroud)


Ped*_*C88 8

怎么样:

SELECT count(column_1)
FROM
    (SELECT * FROM temptable
    GROUP BY column_1, column_2, column_3, column_4) AS Records
Run Code Online (Sandbox Code Playgroud)


小智 5

CTE 为我工作:

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

select COUNT(col1)
from cte;
Run Code Online (Sandbox Code Playgroud)

  • CTE = 通用表表达式 (2认同)