2010-10-08 75 views
10

actualmente estoy usando la siguiente consulta para obtener algunos números:Cálculo del promedio ponderado en MySQL?

SELECT gid, count(gid), (SELECT cou FROM size WHERE gid = infor.gid)  
FROM infor 
WHERE id==4325 
GROUP BY gid; 

La salida que estoy recibiendo en mi etapa actual es la siguiente:

+----------+-----------------+---------------------------------------------------------------+ 
| gid  | count(gid)  | (SELECT gid FROM size WHERE gid=infor.gid)     | 
+----------+-----------------+---------------------------------------------------------------+ 
|  19 |    1 |               19 | 
|  27 |    4 |               27 | 
|  556 |    1 |               556 | 
+----------+-----------------+---------------------------------------------------------------+ 

Estoy tratando de calcular el es decir, la media ponderada

(1 * 19 + 4 * 27 + 1 * 556)/(19 + 27 + 556)

¿Hay alguna manera de hacerlo con una sola consulta?

Respuesta

13

Uso:

SELECT SUM(x.num * x.gid)/SUM(x.cou) 
    FROM (SELECT i.gid, 
       COUNT(i.gid) AS num, 
       s.cou 
      FROM infor i 
    LEFT JOIN SIZE s ON s.gid = i.gid 
     WHERE i.id = 4325 
     GROUP BY i.gid) x 
+0

Impresionante ... Muchas gracias por esto. Estaba a punto de escribir un bucle anidado dentro de un procedimiento, pero luego encontré un artículo que decía: "Si necesitas un bucle anidado, entonces no miraste un JOIN" :) – Legend

+0

@legend: El consejo es correcto, pero JOINs también riesgo de inflar registros si hay más de un niño asociado con el padre. Si desea filas distintas del padre, es mejor usar una subconsulta (EXISTS sería mi recomendación). –

+0

Ya veo. En mi caso, hay exactamente un elemento, pero tendré en cuenta tus consejos. – Legend

1

Puede colocar su consulta original como una sub consulta y SUMAR los registros. No podía probar esto, ya que no tengo el conjunto de datos que haces, pero debería funcionar en teoría;)

SELECT SUM(gid)/SUM(weights) AS calculated_average FROM (
    SELECT gid, (COUNT(gid) * gid) AS weights 
    FROM infor 
    WHERE id = 4325 
    GROUP BY gid); 
+0

+1 para este enfoque. Gracias. Solo curiosidad por saber cuál es más eficiente. Correrá a 'EXPLAIN' y verá. – Legend

+0

@Legend, no hay problema. De hecho, puede necesitar el 'JOIN', pero desde el OP, no vi su necesidad. –

Cuestiones relacionadas