トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

2-3-20 条件付き平均(重複なし)

SQLパズル

テーブル
ID  Val
--  ---
 1   10
 1   30
 1   60
 1   90
 2   10
 2   60
 2   90
 3   10
 3   90
 4   50

IDごとのValの平均を求める
ただし、IDごとのレコード数が3件以上だったら
最大値と最小値は対象外とする。

また、テーブルに重複したレコードは存在しないものとする。

出力結果
ID  平均
--  ----
 1    45  (30+60)/2
 2    60
 3    50  (10+90)/2
 4    50


SQL

select ID,
case when count(*) >= 3
     then (sum(Val) - max(Val) - min(Val)) / (count(*)-2)
     else avg(Val) end as 平均
from (select 1 as ID,10 as Val from dual
union select 1,30 from dual
union select 1,60 from dual
union select 1,90 from dual
union select 2,10 from dual
union select 2,60 from dual
union select 2,90 from dual
union select 3,10 from dual
union select 3,90 from dual
union select 4,50 from dual)
group by ID
order by ID;


解説

count関数で件数を取得して分岐させてます。