2009-11-18 15 views
0

J'ai une tablecalcul de la moyenne en moyenne dans mySQL

voiture

id | person_id | mpg 
------------------------ 
4 |  1  | 50 
5 |  1  | 15 
6 |  2  | 10 
7 |  2  | 28 
8 |  3  | 33 

je dois obtenir une moyenne de mpg de chaque personne, puis en moyenne pour le groupe.

person 1 avg = (50 + 15)/2 = 32.5 
person 2 avg = (10 + 28)/2 = 19 
person 3 avg = 33 

group average = 32.5 + 19 + 33/3 = 28.1 

Y at-il une requête qui fera ce dont j'ai besoin?

+2

Don Ne faites pas la moyenne des moyennes, car vous perdrez le poids des moyennes. i.e: 10 voitures à 50 mpg en moyenne et une voiture à 10 mpg "moyenne" vous donnera 30mpg comme la moyenne totale, ce qui est très faux :) –

+0

Je ne suis pas d'accord. 2 voitures vertes à 50 mpg, 2 voitures rouges à 20 mpg et 1 voiture noire à 10 mpg ont deux résultats différents: - en moyenne tout: 150/5 = 30 mpg - en faisant la moyenne des moyennes pour chaque voiture: (50 + 20 + 10)/3 = 26.667 La première option est celle que vous avez indiquée, mais pas nécessairement ce qui est recherché! –

+1

Je compare le mpg moyen d'une personne au mpg moyen d'autres personnes avec une moyenne de groupe de mpg par personne. Je ne veux pas que le gars avec les voitures de 10 - 50 mpg pour fausser les résultats. Je veux faire la moyenne de sa moyenne de 50 avec le gars qui a 1 voiture à 10mpg. – Emily

Répondre

5
SELECT person_id, AVG(mpg) from car group by person_id; 

Si vous voulez obtenir une moyenne pour le groupe , vous devriez probablement faire ceci:

SELECT AVG(mpg) from car; 

Sauf si vous voulez vraiment faire la moyenne des moyennes, ce qui me semble un peu douteux:

SELECT AVG(average) from (SELECT person_id, AVG(mpg) as average from car group by person_id); 
2

vous ne pouvez pas résoudre ce dans une requête, mais vous devez utiliser 2 requêtes ou 1 requête en résoudre la moyenne overal dans votre code

select person, avg(mpg) from cat group by person 
0
SELECT person_id, AVG(mpg) AS mpg_avg FROM car GROUP BY person_id WITH ROLLUP 

Le WITH ROLLUP -modifier ajoutera une ligne au jeu de résultats où persion_id est NULL et mpg_avg est la moyenne sur la totalité des résultats (MySQL> = 4.1.1):

person_id | mpg 
------------------ 
     1 | 32.5 
     2 | 19.0 
     3 | 33.0 
     NULL | 27.2