AVG功能问题

时间:2011-08-01 15:13:17

标签: mysql sql aggregate-functions average

我有结构表

id
YearBorn
sex
livelen

我需要接收两性的平均livelength(livelen)的输出结果表 with struct

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(男性)的总和 livlen 除以 livlen 的记录总数的结果,但不完全是 f的数量或m * * 你能说些什么

2 个答案:

答案 0 :(得分:3)

0替换为NULL。否则,该值也会计算:

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

70 + 90
------- = 80
   2

答案 1 :(得分:1)

使用您自己的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更便携,然后内联IF