2017-12-30 30 views
0

concert_idに基づいて出席の平均を数えるには?Oracle - コンサート自体に基づいて出席の平均を数えるには?

は、これまでのところ、私がやっていることのようになるAVG_ATTENDANCE_EACH_CONCERTにする方法この

select concert_id, event_id, count(customer_id) attendance, 
case when concert_id = 1 
    then (select count(customer_id)/count(concert_id) 
    from booking where concert_id=1) 
    end as avg_attendance_each_concert 
from booking 
group by event_id, concert_id 
order by event_id; 

結果

CONCERT_ID EVENT_ID ATTENDANCE AVG_ATTENDANCE_EACH_CONCERT 
---------- ---------- ---------- --------------------------- 
     1   1   1       3 
     1   2   2       3 
     2   3   2 
     2   4   1 
     3   5   2 
     3   6   2 
     4   8   2 
     4   9   2 
     5   11   4 
     5   12   1 
     5   13   1 

のようなものですか?

CONCERT_ID EVENT_ID ATTENDANCE AVG_ATTENDANCE_EACH_CONCERT 
---------- ---------- ---------- --------------------------- 
     1   1   1       1.5 --> 3 attendance/2 same concert_id 
     1   2   2       1.5 
     2   3   2       1.5 --> 3 attendance/2 same concert_id 
     2   4   1       1.5 
     3   5   2       2 --> 4 attendance/2 same concert_id 
     3   6   2       2 
     4   8   2       2 --> 4 attendance/2 same concert_id 
     4   9   2       2 
     5   11   4       2 --> 6 attendance/3 same concert_id 
     5   12   1       2 
     5   13   1       2 

私は、その分析の形式でAVGについての平均出席以下

答えて

1

方法を持っているイベント表示したいと思いますので?

(ちなみに、CONCERT_ID = 5の例は間違っています; 6/3 = 2、3ではなく)。

SQL> with booking (concert_id, event_id, customer_id) as 
    2 (select 1, 1, 10 from dual union 
    3 select 1, 2, 10 from dual union 
    4 select 1, 2, 20 from dual union 
    5 -- 
    6 select 3, 5, 10 from dual union 
    7 select 3, 5, 20 from dual union 
    8 select 3, 6, 30 from dual union 
    9 select 3, 6, 40 from dual union 
10 -- 
11 select 5, 11, 10 from dual union 
12 select 5, 11, 20 from dual union 
13 select 5, 11, 30 from dual union 
14 select 5, 11, 40 from dual union 
15 select 5, 12, 50 from dual union 
16 select 5, 13, 60 from dual 
17 ) 
18 select concert_id, event_id, count(customer_id) attendance, 
19 avg(count(*)) over (partition by concert_id) avg_attendance_each_concert 
20 from booking 
21 group by concert_id, event_id 
22 order by event_id; 

CONCERT_ID EVENT_ID ATTENDANCE AVG_ATTENDANCE_EACH_CONCERT 
---------- ---------- ---------- --------------------------- 
     1   1   1       1,5 
     1   2   2       1,5 
     3   5   2       2 
     3   6   2       2 
     5   11   4       2 
     5   12   1       2 
     5   13   1       2 

7 rows selected. 

SQL> 
+0

ワウは魔法のように働いています。 分析的な相談について聞いたことがありません。 over(partition by column_name)の使い方 私が混乱しているのは、partition by clauseです。 – sekti92

+0

@ sekti92 - [Analytic Functions](https://docs.oracle.com/database/121/SQLRF/functions004.htm)のドキュメントを参照してください。 –

関連する問題