2010-04-27 3 views
171

J'ai une requête de sélection SQL qui a un groupe par. Je veux compter tous les enregistrements après l'instruction group by. Existe-t-il un moyen pour cela directement de sql? Par exemple, ayant une table avec les utilisateurs que je veux sélectionner les différentes villes et le nombre total des utilisateursComment utiliser count et group by par la même instruction select

select town, count(*) from user 
group by town 

Je veux avoir une colonne avec toutes les villes et un autre avec le nombre d'utilisateurs dans tous les lignes

Un exemple du résultat pour avoir 3 villes et 58 utilisateurs au total est:

Town   Count 
Copenhagen 58 
NewYork  58 
Athens  58 
+0

vous voulez dire que vous voulez que votre jeu de résultats ait 2 comptes un pour les villes et un pour les utilisateurs? – Leslie

+2

Donc vous voulez une ligne pour chaque ville, et dans chaque rangée, la colonne 2 contient le nombre total de tous les utilisateurs? Donc, la colonne 2 a la même valeur * pour chaque ligne? Si vous modifiez pour inclure des exemples de données et la sortie requise, nous serons en mesure de vous donner exactement ce que vous voulez. – AakashM

+0

Vous avez raison AakashM! Je viens de l'éditer. – Stavros

Répondre

218

Cela va faire ce que vous voulez (liste des villes, avec le nombre d'utilisateurs dans chaque):

select town, count(town) 
from user 
group by town 

Vous pouvez utiliser la plupart des aggregate functions lors de l'utilisation de GROUP BY.

Mise à jour (suite au changement à la question et les commentaires)

Vous pouvez déclarer une variable pour le nombre d'utilisateurs et le mettre au nombre d'utilisateurs puis sélectionnez avec cela.

DECLARE @numOfUsers INT 
SET @numOfUsers = SELECT COUNT(*) FROM user 

SELECT DISTINCT town, @numOfUsers 
FROM user 
+0

c'est exactement ce que l'OP a écrit? nvm, je vois votre différence, vous comptez Town pas * .... – Leslie

+0

@Leslie - il n'y a pas de différence entre les deux requêtes. Ils retourneront le même jeu de résultats. Je n'aime pas l'utilisation de '*' ... L'OP a répondu à sa propre question, mais n'a pas semblé même la tester, je suis juste en train de valider que c'est correct :) http://www.fredosaurus.com/notes- db/select/groupby.html – Oded

+6

COUNT (*) peut ne pas correspondre à COUNT (Town). Utiliser * dans COUNT est parfaitement valide ... – gbn

3

Avec Oracle, vous pouvez utiliser les fonctions analytiques:

select town, count(town), sum(count(town)) over() total_count from user 
group by town 

Vos autres options est d'utiliser un sous-requête:

select town, count(town), (select count(town) from user) as total_count from user 
group by town 
+0

quelque chose comme le dernier fonctionnerait, mais je voulais voir s'il y a une autre solution .. – Stavros

+0

Et ne pouvez-vous pas utiliser la première option (fonction analytique)? Quelle plateforme de base de données utilisez-vous? – Tommi

+0

@Stavros: Le dernier est lent –

25

L'autre façon est:

/* Number of rows in a derived table called d1. */ 
select count(*) from 
(
    /* Number of times each town appears in user. */ 
    select town, count(*) 
    from user 
    group by town 
) d1 
+5

alias autrement ne fonctionnerait pas dans mysql. Sélectionnez le nombre (*) de() agr – amas

2

Si vous voulez commander en comptant (son simple mais je Can`t trouvé une réponse sur la pile de la façon de le faire) que vous pouvez faire:

 SELECT town, count(town) as total FROM user 
     GROUP BY town ORDER BY total DESC 
119

Vous pouvez utiliser COUNT(DISTINCT ...):

SELECT COUNT(DISTINCT town) 
FROM user 
+3

fonctionne comme un charme ... devrait être choisi la réponse principale .. sauf une certaine sonde que ce n'est pas bon. – Victor

+0

Ne fonctionne pas en combinaison avec une clause WHERE. –

+0

@PerLindberg, fonctionne bien pour moi. Ajouter WHERE après FROM. – milkovsky

2

Vous pouvez utiliser dans le COUNT DISTINCT comme ce que milkovsky dit

dans mon cas:

select COUNT(distinct user_id) from answers_votes where answer_id in (694,695); 

Cela va tirer le décompte des voix de réponse considérée comme la même u ser_id comme un chef

1

Si vous voulez sélectionner la ville et nombre total d'utilisateurs, vous pouvez utiliser cette requête ci-dessous:

SELECT Town, (SELECT Count(*) FROM User) `Count` FROM user GROUP BY Town; 
0

Essayez le code suivant:

select ccode, count(empno) 
from company_details 
group by ccode; 
+0

pouvez-vous expliquer ce que fait ce code. Merci – MZaragoza

+0

nous utilisons ce code pour trouver le nombre total d'employés pour aujourd'hui calc dans chaque ccode (société) exemple: count (empno) est 1839 pour ccode 1 et count (empno) est 9421 pour ccode 47. – balajibran

2

Je sais que c'est un ancien message, dans SQL Server:

select isnull(town,'TOTAL') Town, count(*) cnt 
from user 
group by town WITH ROLLUP 

Town   cnt 
Copenhagen 58 
NewYork  58 
Athens  58 
TOTAL  174 
+4

Il ya Rien de mal à répondre aux anciens messages. Cependant, veuillez inclure une explication de votre code ainsi que le code lui-même. – Shelvacu

0

Si vous souhaitez utiliser l'option Sélectionner toutes les requêtes avec nombre, essayez ceci ...

select a.*, (Select count(b.name) from table_name as b where Condition) as totCount from table_name as a where where Condition 
+0

Nous vous remercions de cet extrait de code, qui pourrait fournir une aide immédiate et limitée. Une explication appropriée [améliorerait considérablement] (// meta.stackexchange.com/q/114762) sa valeur à long terme en montrant * pourquoi * ceci est une bonne solution au problème, et le rendrait plus utile aux futurs lecteurs avec d'autres questions similaires. S'il vous plaît [modifier] votre réponse pour ajouter quelques explications, y compris les hypothèses que vous avez faites. –

Questions connexes