2012-08-03 3 views
2

Instruction SQL actuelle:autre groupe par le comte

SELECT count(installUserID) as userCount 
    FROM installUsers 
    group by installationID 

Sortie courant:

userCount 
4 
2 
1 
1 
1 
2 
4 
1 
3 
1 

Je suis en train de compter le nombre de fois que le userCount est 1, ainsi que 2, etc .. .

Exemple de sortie souhaitée:

userCount = 1, 5 times 
userCount = 2, 2 times 
userCount = 3, 1 times 
userCount = 4, 2 times 

J'ai regardé autour de l'Internet et je pense qu'il y a quelque chose que je peux faire avec les fonctions d'agrégat, peut-être avec grouping, mais je ne suis toujours pas clair sur la façon de procéder avec sql pur.

+0

Vous avez presque SELECT 'il installUserID, count (installUserID) comme userCount DE installUsers groupe par installationID' – JonH

Répondre

3

Il semble que vous vouliez compter les comptes. Pour ce faire, vous pouvez utiliser une sélection externe:

SELECT userCount, COUNT(*) AS userCountcount 
FROM 
(
    SELECT COUNT(installUserID) as userCount 
    FROM installUsers 
    GROUP BY installationID 
) AS T1 
GROUP BY userCount 
ORDER BY userCount 
+0

Pourquoi auriez-vous besoin d'une instruction select intérieure pour cela? – JonH

+1

Parce que a) le 'GROUP BY' est différent et b) vous ne pouvez pas imbriquer les fonctions d'agrégat. Je n'ai pas dit que vous aviez besoin d'un select interne - vous pouvez utiliser un select interne ... ou vous pouvez utiliser un CTE. Cela ne fait pas une énorme différence. –

+0

Le CTE n'est pas nécessaire, il suffit de COUNT la colonne et GROUP par la même colonne. – JonH

3

Vous pouvez également utiliser un CTE. Peut-être plus de tuer pour cela mais vient en puissant à portée de main.

WITH count_cte(usercount) 
AS 
(
    SELECT COUNT(installUserID) AS userCount 
    FROM installUsers 
    GROUP BY installationID 
) 

SELECT usercount ,COUNT(usercount) AS times FROM count_cte GROUP BY usercount