Mysql平均值基于sum在另一列中

时间:2014-03-12 10:20:07

标签: mysql sql if-statement sumifs

例如,我可以说我试图找出每个父母的男性和女性的平均分数。

示例数据如下所示:

parentID    childID    sex    score
------------------------------------
1           21         m      17
1           23         f      12
2           33         f      55
2           55         m      22 
3           67         m      26
3           78         f      29
3           93         m      31

这是我想要的结果:

parentID    offspring   m    f   avg-m  avg-f  avg-both
----------------------------------------------------
1           2           1    1   17     12     14.5 
2           2           1    1   22     55     38.5
3           3           2    1   28.5   29     28.67

通过以下查询,我可以找到男性和女性的平均值,但我不确定如何获得男性或女性的平均值

SELECT parentID, COUNT( childID ) AS offspring, SUM( IF( sex =  'm', 1, 0 ) ) AS m, SUM( IF( sex =  'f', 1, 0 ) ) AS f, max(score) as avg-both
FROM sexb_1
WHERE avg-both > 11
GROUP BY parentID

我在查询中尝试了类似的内容,但它返回错误

AVG(IF(sex = 'm', max(score),0)) as avg-m

3 个答案:

答案 0 :(得分:1)

  

我在查询中尝试了类似的内容,但它返回错误

AVG(IF(sex = 'm', max(score),0)) as avg-m

你不能在另一个中使用一个聚合函数(在这种情况下,在MAX()AVG()) - 这甚至意味着什么?一旦发现该组的MAX(),那么平均值是什么?

相反,您希望获取性别符合您要求的AVG() score个值;由于AVG()会忽略NULL个值,而且不匹配的CASE表达式的默认值为NULL,因此可以执行以下操作:

SELECT   parentID, 
         COUNT(*) offspring,
         SUM(sex='m') m,
         SUM(sex='f') f,
         AVG(CASE sex WHEN 'm' THEN score END) `avg-m`,
         AVG(CASE sex WHEN 'f' THEN score END) `avg-f`,
         AVG(score) `avg-both`
FROM     sexb_1
GROUP BY parentID
HAVING   `avg-both` > 11

sqlfiddle上查看。

答案 1 :(得分:1)

使用if

SELECT parentID, COUNT( childID ) AS offspring, 
      SUM(iF( sex='m', 1 ,0 )) AS m, 
      SUM(iF( sex='f', 1 ,0 )) AS f,
      AVG(if(sex='m', score, null)) as avg_m,
      AVG(if(sex='f', score, null)) as avg_f,
      AVG(score) as avgboth
FROM     sexb_1
GROUP BY parentID
HAVING   avgboth > 11

fiddle

  • 在您的查询中,错误是由avg-both的使用造成的。您需要使用back ticksunderscore作为别名。在此,它将其视为difference of avg and both
  • 并且你也不能在where子句中使用别名,因为从查询中获取表名后,接下来是where子句。所以数据库还不知道别名。

答案 2 :(得分:1)

您可以尝试以下查询 -

    SELECT 
    parentID, COUNT(childID) AS `offspring`,
     COUNT(IF(sex = 'm',sex ,NULL )) AS `m`, COUNT(IF(sex = 'f', sex,NULL)) AS `f`,
     AVG(IF(sex = 'm',score,NULL )) AS `avg-m`, COUNT(IF(sex = 'f', score,NULL)) AS `avg-f`, 
AVG(score) AS `avg-both` 
    FROM sexb_1 
    GROUP BY parentID 
    HAVING `avg-both` > 11;