2010-05-26 11 views
0

Mon application effectue un certain nombre de requêtes avec la forme générale:Retourne le nombre d'enregistrements numérisés dans la requête globale

SELECT <aggregate-functions> 
FROM <table-name> 
WHERE <where-clause> 
GROUP BY <group-by column list> 

Je voudrais savoir combien de dossiers ont contribué à l'ensemble de résultats global (en d'autres termes, comment de nombreux enregistrements correspondaient aux conditions de la clause WHERE), quelque chose qui est masqué en raison à la fois des fonctions d'agrégation de la clause SELECT et de la clause GROUP-BY. Je sais que je pourrais faire un simple SELECT COUNT (*) en utilisant la même clause WHERE pour obtenir ce nombre, mais je voudrais éviter une seconde requête si possible. Existe-t-il une fonction/fonction/etc SQL Server qui produira cette valeur sans une autre requête?

Répondre

1

Une solution simple serait une sous-sélection:

Select ... 
    , (Select Count(*) 
     From Table 
     Where ...) As TotalCount 
From Table 
Where ... 
Group By ... 

Si vous utilisez SQL Server 2005 ou version ultérieure, vous pouvez faire quelque chose comme ce qui suit:

With RankedItems As 
    (
    Select Col1 
     , Row_Number() Over (Order By Col1 Asc, Col2 Asc...) As Num 
     , Row_Number() Over (Order By Col1 Desc, Col2 Desc) As RevNum 
    From Table 
    Where ... 
    ) 
Select Col1, Min(Num + RevNum - 1) As TotalCount 
From RankedItems 
Group By Col1 
+0

Super, cela fait exactement ce que je veux. Je ne sais pas pourquoi je n'y ai pas pensé. – Dan

1

Vous pouvez ajouter un compte pour une valeur arbitraire qui a impliqué l'agrégation, ou même faire

SELECT x.name, 
     y.name, 
     z.name, 
     AVG(x.tacos) AS average_tacos, 
     SUM(1) AS aggregated_row_count 
FROM .... 
WHERE ... 
GROUP BY x.name, y.name, z.name 
+0

Cela semble bien fonctionner aussi. Je devrais juste additionner la colonne aggregated_row_count dans le jeu de résultats pour obtenir le nombre total de lignes. – Dan