159 votes

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

Comment puis-je compter le nombre d'enregistrements retournés par une requête group by,

Pour exemple:

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

Me donne,

1
1
2

J'ai besoin de compter les registres ci-dessus pour obtenir 1+1+1 = 3.

186voto

gbn Points 197263

Vous pouvez faire les deux en une seule requête à l'aide de la clause OVER sur un autre compte

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

84voto

Thomas Points 42973

La solution la plus simple est d'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 est d'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

28voto

cartbeforehorse Points 447

Je sais que c'est un peu tard, mais personne ne l'a suggéré ceci:

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

Cela fonctionne dans Oracle au moins - je n'en ai pas actuellement d'autres bases de données pour le tester, et je ne suis pas si à l'aise avec T-Sql et MySQL syntaxe.

Aussi, je ne suis pas entièrement sûr de savoir si c'est plus efficace dans l'analyseur de faire de cette façon, ou si tout le monde est solution de l'imbrication de l'instruction select est mieux. Mais je la trouve plus élégant à partir d'un codage point de vue.

13voto

Manish Mulani Points 901

J'essayais d'atteindre le même sans sous-requête et a été en mesure d'obtenir le résultat requis comme ci-dessous

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

5voto

SQL Pete Points 1

Un CTE a fonctionné pour moi:

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

select COUNT(col1)
from cte;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X