如果在另一列中,则基于总和的Mysql平均值

标签 mysql sql if-statement sumifs

举个例子,假设我试图计算出每个 parent 对男性和女性的平均分数。

示例数据如下所示:

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

最佳答案

I tried something like this in the query but it returns an error

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

您不能在另一个聚合函数中使用一个聚合函数(在这种情况下,AVG() 中的 MAX())——这意味着什么?一旦发现组的 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 .

关于如果在另一列中,则基于总和的Mysql平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22348351/

相关文章:

sql - 如何正确使用Oracle ORDER BY和ROWNUM?

c++ - 我的程序中出现访问冲突(段错误)?

R:改进嵌套 ifelse 语句和多种模式

mysql更新地理点

php - 数据库搜索结果给出尝试获取 $result 上的非对象错误的属性

UNION查询的Mysql错误

php - 不明白为什么 if 语句没有 {}

mysql - 尝试在现有的 mysql 数据库上构建 Rails 3.2 应用程序

mysql - 复合外键插入

sql - 填补稀疏数据中的日期空白