обобщение отчета о продажах за 3 месяца по 2 филиалам с выделением 3 лучших продуктов за каждый месяц

У меня есть следующая таблица REPORT

m = month,
pid = product_id,
bid = branch_id,
s = sales

m       pid     bid     s
--------------------------
1       1       1       20
1       3       1       11
1       2       1       14
1       4       1       16
1       5       1       31
1       1       2       30
1       3       2       10
1       2       2       24
1       4       2       17
1       5       2       41
2       3       1       43
2       5       1       21
2       4       1       10
2       1       1       5
2       2       1       12
2       3       2       22
2       5       2       10
2       4       2       5
2       1       2       4
2       2       2       10
3       3       1       21
3       5       1       10
3       4       1       44
3       1       1       4
3       2       1       14
3       3       2       10
3       5       2       5
3       4       2       6
3       1       2       7
3       2       2       10

Я хотел бы получить сводку по этой таблице продаж, показав 3 лучших продаж среди продуктов во всех филиалах. что-то вроде этого:

m       pid     total
---------------------
1       5       72
1       1       50
1       4       33
2       3       65
2       5       31
2       2       22
3       4       50
3       3       31
3       2       24

Таким образом, в первый месяц продукт № 5 имеет самый высокий общий объем продаж — 72, за ним следует продукт № 1 — 50 и т. д. если бы я мог разделить их на разные таблицы для каждого месяца, было бы лучше

пока что я могу сделать сводку за 1 месяц и показать все, а не топ-3.

select pid, sum(s)
from report
where m = 1
group by pid
order by sum(s);

большое спасибо!


person joeyy27    schedule 08.10.2014    source источник
comment
Какую базу данных вы используете?   -  person Gordon Linoff    schedule 08.10.2014
comment
oracle 11g в университетской лаборатории   -  person joeyy27    schedule 08.10.2014


Ответы (1)


Большинство баз данных поддерживают стандартные оконные функции ANSI. Вы можете делать что хотите с row_number():

select m, pid, s
from (select r.m, r.pid, sum(s) as s,
             row_number() over (partition by m order by sum(s) desc) as seqnum
      from report r
      group by r.m, r.pid
     ) r
where seqnum <= 3
order by m, s desc;
person Gordon Linoff    schedule 08.10.2014
comment
Привет, спасибо, это работает, я внес некоторые изменения: 1) добавить в конце строки 2, возможно, это требования оракула. 2) удалите pid в последней строке, поэтому просто закажите m, s desc; вывод пока здесь выглядит нормально. Что вы думаете? - person joeyy27; 09.10.2014