2011-10-25 16 views
10

Actualmente estoy trabajando en una tarea que me obliga a encontrar el promedio en la cantidad de recursos para cada módulo. La tabla actual se parece a esto:Promedio en un recuento() en la misma consulta

ResourceID ModulID 
    1   1 
    2   7 
    3   2 
    4   4 
    5   1 
    6   1 

Así que, básicamente, estoy tratando de encontrar la manera de obtener el número promedio de recursos. El único datos de prueba relevantes aquí es para el módulo 1, que tiene 3 recursos diferentes conectados. Pero necesito mostrar todos los resultados.

Este es mi código:

select avg(a.ress) GjSnitt, modulID 
from 
(select count(ressursID) as ress 
from ressursertiloppgave 
group by modulID) as a, ressursertiloppgave r 
group by modulID; 

Obviamente no está funcionando, pero estoy actualmente en la pérdida de lo que cambiar en este punto. Realmente apreciaría cualquier aporte que ustedes tengan.

+0

¿Puede usted no sólo tiene que utilizar la consulta externa ('AVG () 'agrupado por ModulId) sin la consulta interna? Yo pensaría que eso produciría los resultados esperados. –

+0

El problema con AVG() es que toma el valor conjunto, y toma el promedio en el valor único. Como ejemplo, los recursos 1,5 y 6 hacen 12. Que luego usa para tomar la suma promedio. Necesito que sea 1.5, ya que hay 3 resourceID conectados a ModulID 1. – Coss

Respuesta

21

Esta es la consulta que está ejecutando, escrita en una sintaxis ligeramente menos obtusa.

SELECT 
    avg(a.ress) as GjSnitt 
    , modulID 
FROM 
    (SELECT COUNT(ressursID) as ress 
    FROM ressursertiloppgave 
    GROUP BY modulID) as a 
CROSS JOIN ressursertiloppgave r <--- Cross join are very very rare! 
GROUP BY modulID; 

Eres cruz se unen a la mesa, haciendo (6x6 = 36) filas en total y condensando esto a 4, pero debido a que el recuento total es 36, el resultado es incorrecto.
Es por eso que nunca deberías usar uniones implícitas.

reescribir la consulta a:

SELECT AVG(a.rcount) FROM 
    (select count(*) as rcount 
    FROM ressursertiloppgave r 
    GROUP BY r.ModulID) a 

Si desea que el recuento de filas individuales y de la media en la parte inferior hacer:

SELECT r1.ModulID, count(*) as rcount 
FROM ressursertiloppgave r1 
GROUP BY r1.ModulID 
UNION ALL 
    SELECT 'avg = ', AVG(a.rcount) FROM 
    (select count(*) as rcount 
    FROM ressursertiloppgave r2 
    GROUP BY r2.ModulID) a 
+0

Obtengo el valor para el primer modulID, que muestra el resultado correcto. ¿Pero cómo puedo obtener el resto de los modulIDs? Cuando incluyo modulID en la primera selección y hago un grupo por modulID, obtengo el mismo resultado que cada modulID. – Coss

+0

@Coss, mira la pregunta actualizada. – Johan

+0

¡Ah, ya veo! Pero creo que he sido torpe con mi pregunta. Lo que estoy buscando es un promedio en cada recuento de filas, si eso es posible. – Coss

Cuestiones relacionadas