Проблема с функциями AVG - PullRequest
       21

Проблема с функциями AVG

2 голосов
/ 01 августа 2011

У меня есть таблица со структурой

id
YearBorn
sex
livelen

Мне нужно получить таблицу результатов вывода средней продолжительности жизни (livelen) для обоих полов со структурой

year, len1(female), len2(male)

Мой запрос

SELECT YearBorn , 
AVG(IF(sex='F', LiveLen, 0)) len1(female),
AVG(IF(sex='M', LiveLen, 0)) len2(male)
FROM persons p
GROUP BY YearBorn

, но он не работает должным образом. Возвращаемое среднее значение является результатом деления суммы ливлен fem (мужской) на общее количество записей ливлен , но неточно на число f или m *. * Что вы можете сказать по этому поводу

Ответы [ 2 ]

3 голосов
/ 01 августа 2011

Заменить 0 на NULL.В противном случае значение также имеет значение:

70 + 0 + 90
------------ = 50
     3

70 + 90
------- = 80
   2
1 голос
/ 01 августа 2011

Используйте свой собственный AVG

SELECT
   YearBorn , 
   SUM(IF(sex='F', LiveLen, 0))/COUNT(IF(sex='F', LiveLen, 0)) len1(female),
   SUM(IF(sex='F', LiveLen, 0))/COUNT(IF(sex='F', LiveLen, 0)) len2(male)
FROM persons p
GROUP BY YearBorn

Или используйте NULL, который игнорируется в агрегатах.0 - это значение

SELECT
   YearBorn , 
   AVG(CASE WHEN sex = 'F' THEN LiveLen ELSE NULL END) len1(female),
   AVG(CASE WHEN sex = 'M' THEN LiveLen ELSE NULL END) len2(male)
FROM persons p
GROUP BY YearBorn

CASE более переносим, ​​чем встроенный, если он тоже

...