0

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

示例数据如下所示:

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
4

3 回答 3

1

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

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

您不能在另一个聚合函数中使用一个聚合函数(在本例中为MAX()within 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上查看。

于 2014-03-12T10:25:06.030 回答
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

小提琴

  • 在您的查询中,错误是由于使用了avg-both您需要使用back ticksunderscore作为别名。在这里它认为它是difference of avg and both
  • 而且您不能在 where 子句中使用别名,因为在从查询中获取表名之后,接下来是 where 子句。所以数据库还不知道别名。
于 2014-03-12T10:32:31.690 回答
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;
于 2014-03-12T10:55:56.793 回答