2009-10-10 10 views
0

je le tableau suivant:comment calculer compter en sql?

memberid 
2 
2 
3 
4 
3 

... et je veux que le résultat suivant:

memberid count 
2   2 
3   1 ---Edit by gbn: do you mean 2? 
4   1 

je tentais d'utiliser:

SELECT MemberID, 
     COUNT(MemberID) 
    FROM YourTable 
GROUP BY MemberID 

... mais maintenant Je veux trouver quel enregistrement qui a le nombre maximum. IE:

memberid count 
2   2 
+0

Le nombre de memberid 3 devrait être 2 dans votre exemple. –

+0

Comme Dave l'a souligné dans ses commentaires, il semble que vous demandiez deux ensembles de résultats. Est-ce exact? (Je pense que je l'ai eu dans ma réponse ci-dessous.) – Yoav

Répondre

1
SELECT MemberID, COUNT(MemberID) FROM YourTable GROUP BY MemberID 
+0

semble complètement correct pour moi – Atmocreations

+0

@Atmocreations: pas les lignes 1 ou 2, seulement la 3ème déclaration avec l'agrégat. Vous devez considérer l'historique d'édition. – gbn

+0

Désolé, la mise en forme originale de la question était ce qui m'a découragé. C'est pourquoi je l'ai réparé. –

12
SELECT memberid, COUNT(*) FROM TheTable GROUP BY memberid 

Bien, il ne fonctionnera pas pour votre sortie désirée parce que vous avez "memberid = 3" deux fois.

Edit: Après la mise à jour fin à la question ...

SELECT TOP 1 WITH TIES --WITH TIES will pick up "joint top". 
    memberid, COUNT(*) 
FROM 
    TheTable 
GROUP BY 
    memberid 
ORDER BY 
    COUNT(*) DESC 
+0

vous n'avez pas répondu à la deuxième partie de la question – Dave

+0

@Dave: vous voulez dire que l'un ajouté une heure ou après j'ai répondu? – gbn

+0

AVEC DES LIENS. Beau. – Yoav

-1

SELECT count (nom_colonne) DE your_table;

+0

Ceci est une réponse incorrecte –

0

le faire comme ceci:

SELECT memberid, COUNT(memberid) AS [count] FROM [Table] GROUP BY memberid 
1

Et s'il y a un lien (ou plus) pour le max? Voulez-vous en afficher un ou tous?

Voilà comment je ferais ce

SELECT memberid, COUNT(1) 
FROM members 
GROUP BY memberid 
HAVING COUNT(1) = (
      SELECT MAX(result.mem_count) 
      FROM ( 
       SELECT memberid, COUNT(1) as mem_count 
       FROM members 
       GROUP BY memberid 
      ) as result 
     ) 

J'aimerais voir une approche plus efficace si.

-1

Vous devez utiliser un sous-:

SELECT MemberID, MAX(Count) FROM 
    (SELECT MemberID, COUNT(MemberID) Count FROM YourTable GROUP BY MemberID) 
GROUP BY MemberID 

Le deuxième groupe en est nécessaire pour revenir à la fois, le comte et la MemberID.

+0

Non, c'est juste mauvais. – erikkallen

+0

Pouvez-vous expliquer cela un peu plus en détail que simplement prétendre, que c'est mauvais? –

+0

Je viens de trouver votre solution. Je pense que le vôtre est encore pire, en tenant compte du fait qu'il peut y avoir plus d'un résultat qui a le nombre maximum. –

0

Cela devrait faire l'affaire sans subselects requis:

select top 1 memberid, COUNT(*) as counted 
from members 
group by memberid 
order by counted desc 
+1

Même problème que la résolution d'erikkallen: Et s'il y a plus de résultats qui ont le même nombre (maximum)? –

+0

Dans l'exemple fourni une ligne unique est dans le résultat, donc ma requête fait en effet ce que l'OP a demandé. Sauf, bien sûr, il voulait dire que memberId = 3 compte seulement 1, auquel cas toutes les réponses sont fausses. –

0

peut être fait assez facile:

SELECT TOP 1 MemberId, COUNT(*) FROM YourTable GROUP BY MemberId ORDER By 2 DESC 
+1

Et s'il y a plus de résultats qui ont le même nombre (maximum)? –

+0

Si, et je dis SI, vous wnat plus d'un, faites SELECTIONNER TOP 1 AVEC TIES ... – erikkallen

0

je crois que l'affiche originale a demandé 2 jeux de résultats. Le seul moyen que je connaisse pour obtenir ceci (dans SQL Server) est de vider les enregistrements d'origine dans une table temporaire, puis de faire un SELECT et MAX sur cela. J'accueille une réponse qui nécessite moins de code!

-- Select records into a temp table 
SELECT 
    Table1.MemberId 
    ,CNT = COUNT(*) 
INTO #Temp 
FROM YourTable AS Table1 
GROUP BY Table1.MemberId 
ORDER BY Table1.MemberId 

-- Get original records 
SELECT * FROM #Temp 

-- Get max. count record(s) 
SELECT 
    Table1.MemberId 
    ,Table1.CNT 
FROM #Temp AS Table1 
INNER JOIN (
    SELECT CNT = MAX(CNT) 
    FROM #Temp 
) AS Table2 ON Table2.CNT = Table1.CNT 

-- Cleanup 
DROP TABLE #Temp 
+0

Oui, ils ont ajouté la 2ème exigence après 3 ou 4 réponses ... – gbn

+0

Meilleur d'utiliser l'exemple de gbn en utilisant AVEC TIES – Yoav

0

Que diriez-vous cette requête:

SELECT TOP 1 MemberID, 
     COUNT(MemberID) 
FROM YourTable 
GROUP BY MemberID 
ORDER by count(MemberID) desc 
Questions connexes