web-dev-qa-db-fra.com

Compter le nombre d'enregistrements renvoyés par groupe par

Comment compter le nombre d'enregistrements renvoyés par un groupe par requête,

Pour par exemple:

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

Donne moi,

1
1
2

Je dois compter les enregistrements ci-dessus pour obtenir 1 + 1 + 1 = 3.

116
Chris

Vous pouvez faire les deux dans une requête en utilisant la clause OVER sur un autre COUNT

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

La solution la plus simple consiste à utiliser une table dérivée:

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

Une autre solution consiste à utiliser un compte 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
58
Thomas

Je sais qu'il est assez tard, mais personne n'a suggéré ceci:

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

Cela fonctionne au moins dans Oracle - je n'ai pas actuellement de base de données pour le tester, et je ne connais pas très bien la syntaxe T-Sql et MySQL.

De plus, je ne suis pas tout à fait sûr s'il est plus efficace dans l'analyseur de le faire de cette façon, ou si la solution de tout autre solution consistant à imbriquer l'instruction select est meilleure. Mais je trouve celui-ci plus élégant du point de vue du codage.

23
cartbeforehorse

J'essayais d'obtenir la même chose sans sous-requête et j'ai pu obtenir le résultat requis ci-dessous.

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

Un CTE a travaillé pour moi:

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

select COUNT(col1)
from cte;
4
SQL Pete

Que diriez-vous:

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

Dans PostgreSQL, cela fonctionne pour moi:

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

Vous pourriez faire:

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
troutinator

Pouvez-vous exécuter le code suivant ci-dessous. Cela a fonctionné dans Oracle.

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

Essayez cette requête:

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

vous pouvez également obtenir par la requête ci-dessous

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
Nitish Sahoo

Suivre PrestoDb , où FirstField peut avoir plusieurs valeurs:

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
0
SUKUMAR S