2014-03-12 116 views
0

例如,我可以說我試圖找出每個父母的男性和女性的平均分數。如果在另一列中,Mysql的平均值基於總和

實例數據是這樣的:

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 

我在查詢中試過類似的東西,但它retu RNS錯誤

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

回答

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

使用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子句。所以數據庫還不知道別名。
1

你可以試試下面的query

​​