将2个分支机构的3个月销售报告总结为每个月的前3个产品

时间:2014-10-08 11:41:04

标签: sql oracle querying

我有以下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

我想要对此销售表进行总结 通过展示所有分支机构中产品的前三名销售额。 像这样的东西:

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

所以在第1个月,产品#5的总销售额最高,为72,其次是产品#1为50 ..依此类推。如果我可以将它们分成每个月的不同表格会更好

到目前为止,我能做的是做一个月的总结并显示整个事情,而不是前三名。

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

非常感谢!

1 个答案:

答案 0 :(得分: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;