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

使用する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-bothYou need to useback ticksまたはunderscorefor the alias name の使用によるものです。ここではそれを次のように考えますdifference of avg and both
  • また、テーブル名がクエリから取得された後、次に来るのは where 句であるため、where 句内でエイリアス名を使用することはできません。そのため、データベースはエイリアス名をまだ認識していません。
于 2014-03-12T10:32:31.690 に答える
1

クエリでこのようなことを試しましたが、エラーが返されます

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

ある集計関数を別の集計関数内 (この場合はMAX()AVG()) で使用することはできません。それは何を意味するのでしょうか? グループの特徴を発見したらMAX()、平均を取るために何がありますか?

代わりに、性別が要件に一致する値AVG()を取りたいと考えています。scoreは値をAVG()無視し、一致しない式NULLのデフォルトは であるため、次のように簡単に実行できます。CASENULL

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 に答える