我有以下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);
非常感谢!
答案 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;