2010-08-04 17 views
8

Je suis en train d'apprendre MySQL - est-il possible de combiner (ou imbriquer) des fonctions d'agrégat?Comment combiner des fonctions d'agrégat dans MySQL?

Étant donné une requête:

SELECT user, count(answer) FROM surveyValues WHERE study='a1' GROUP BY user; 

Cela me donnera le nombre de questions répondues par chaque utilisateur. Ce que je veux vraiment est le nombre moyen de questions répondues par utilisateur ... quelque chose comme:

SELECT avg(count(answer)) FROM surveyValues WHERE study='a1'; 

Quelle est la bonne façon de calculer cette statistique?

Si cela est possible, y a-t-il un moyen de décomposer cette statistique pour chaque question? (les utilisateurs peuvent répondre à la même question plusieurs fois). Quelque chose comme:

SELECT avg(count(answer)) FROM surveyValues WHERE study='a1' GROUP BY question; 

Répondre

12

Vous devez utiliser les sous-requêtes:

SELECT x.user, 
     AVG(x.cnt) 
    FROM (SELECT user, COUNT(answer) AS cnt 
      FROM surveyValues 
      WHERE study='a1' 
     GROUP BY user) x 
GROUP BY x.user 

Vous ne pouvez pas envelopper un agrégat avec un autre agrégat. Vous pouvez intégrer une analyse dans un agrégat, si les fonctions analytiques/de classement/de fenêtrage prises en charge par MySQL ...

+0

En effet, les sous-requêtes sont la réponse. Si vous avez plus d'une requête traitant du nombre de réponses par utilisateur, vous pouvez envisager de placer la sous-requête dans une vue. – tdammers

+0

Oh mec, vous pouvez alias des colonnes? SUPER-chouette. (Je suis sûr que cela semblait super-naïf, mais cela a juste fait ma journée). Merci, fonctionne parfaitement. – Ender

-3

oui - tout semble raisonnable.

Avez-vous essayé et reçu des résultats inattendus?

habituellement, je vous attendre à ce que la colonne d'inclure également dans la conduite de la liste de sélection:

SELECT question, avg(count(answer)) 
FROM surveyValues 
WHERE study='a1' 
GROUP BY question; 
Questions connexes