计算按分组返回的记录数


138

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

例如:

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

给我,

1
1
2

我需要计算以上记录才能得到1 + 1 + 1 = 3。


3
@LorenVS:但这会让我对表中的记录数有所计数。分组后,我需要记录数。
克里斯,

3
group by不会改变行数。1 + 1 + 2(在您的示例中)将是表中的行数。您在寻找3吗?多少个不同的组?
LorenVS 2011年

2
提出问题的另一种方式:如何为给定查询选择不同分组级别的数量?
朱利安

用户为什么提出问题并不总是很明显,但是我到达这里是因为我正在测试视图中的列是候选主键还是组合键。“从VIEWNAME中选择计数(与COLUMNNAME不同)”超时,如果可以总计,则按group by起作用。
肯·弗斯伦德

Answers:


169

您可以在另一个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的回答的评论
Bjinse 2012年

我将如何回响那个计数的数字?
McDan Garrett

1
该解决方案的缺点是,它会多次(针对的每种组合column_1, column_2, column_3, column_4)为您提供答案。这可能会或可能不会产生明显的副作用,具体取决于您如何处理结果。
cartbeforehorse

3
要返回的记录只是数量,增加一个选择顶(1)COUNT(*)()作为....过
吉列尔梅坎波斯哈杉

2
就我而言,使用TOP(1)COUNT()OVER()的查询性能较差。由于只需要组的数量,因此将其更改为DISTINCT COUNT()OVER(),查询性能得到了显着提高。
乔·奥尔德里奇

71

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

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 2012年

5
@Bjinse-一些DBMS将要求所有派生表都具有别名。他们都将接受它,因此包含它不会有任何伤害。我将其添加到我的答案中。
托马斯

25

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

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

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

此外,我也不完全确定解析器是否可以通过这种方式更有效,或者其他人嵌套select语句的解决方案是否更好。但是从编码的角度来看,我认为它更优雅。


托马斯将您的解决方案添加到他的答案中。无论如何。由于维护原因,我不建议您这样做,其他解决方案要好得多。
拉兹万·弗拉维斯·熊猫

@RăzvanFlaviusPanda1.为什么?其他解决方案更好吗?嵌套SQL更加冗长,在我看来,更加混乱并且更难以理解(在支持意义上,更难以维护)。我知道您可能会偏爱其他方式,但这并不是将其“推荐”于其他人偏爱的理由。Thomas确实提出了类似的建议,是的,但是他再次使它看起来好像嵌套SQL是解决方案的必要部分,但事实并非如此。
cartbeforehorse

12

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

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

4

CTE为我工作:

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

select COUNT(col1)
from cte;

3

怎么样:

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

1

您可以这样做:

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

1

在PostgreSQL中,这对我有用:

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

1

您可以执行以下代码吗?它在Oracle中工作。

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

1
无法在sql-server上的聚合内运行聚合。
A. Greensmith '16

0

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

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


0

以下是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

-1

在SQL Server中使用COUNT OVER(PARTITION 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包含什么值?输出行之间是否有所不同?询问者正在寻找不同分组级别的数量。
朱利安
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.