2010-08-04 89 views
8

Estoy recién aprendiendo MySQL - ¿hay alguna manera de combinar (o anidar) las funciones agregadas?¿Cómo combinar funciones agregadas en MySQL?

Dada una consulta:

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

Esto me dará el número de preguntas contestadas por cada usuario. Lo que realmente quiero es el número promedio de preguntas contestadas por usuario ... algo así como:

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

¿Cuál es la forma correcta de calcular esta estadística?

Si esto es posible, ¿hay alguna manera de dividir esta estadística para cada pregunta? (los usuarios pueden responder la misma pregunta varias veces). Algo así como:

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

Respuesta

12

Tienes que usar subconsultas:

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 

No se puede envolver un agregado con otro agregado. Podría envolver una analítica en un agregado, si MySQL soportaba funciones de análisis/clasificación/ventanas ...

+0

De hecho, subconsultas son la respuesta. Si tiene más de una consulta relacionada con el número de respuestas por usuario, puede considerar poner la sub consulta en una vista. – tdammers

+0

Oh hombre, ¿puedes alias las columnas? SUPER-ingenioso. (Estoy seguro de que sonó muy ingenuo, pero esto me alegró el día). Gracias, funciona a la perfección. – Ender

-3

sí - todas parecen razonables.

¿Los probó y obtuvo resultados inesperados?

por lo general, yo esperaría que incluya también la columna de la conducción en la lista de selección:

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