例如,我可以说我试图找出每个父母的男性和女性的平均分数。
示例数据如下所示:
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
答案 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
avg-both
的使用造成的。您需要使用back ticks
或underscore
作为别名。在此,它将其视为difference of avg and both
答案 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;