2014-10-08 49 views
0

我有以下報告表總結在2個分支的3個月的銷售報告到前3的產品每個月份

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 

等一個月1,產品#5與72最高的銷售總額,其次是產品#1爲50 ..等等。如果我可以將它們分成不同的表每個月會更好

到目前爲止,我所能做的就是讓1個月的總結和展示了整個事情,而不是頂部3.

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

非常感謝很多!

+1

你用什麼數據庫? – 2014-10-08 11:43:20

+0

oracle 11g在大學的實驗室 – joeyy27 2014-10-08 11:49:44

回答

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; 
+0

謝謝!稍後將在實驗室中嘗試:) – joeyy27 2014-10-08 11:50:01

+0

嗨,謝謝,它的工作原理,我做了一些修改: 1)在第2行的末尾添加一個「,」可能是oracle的要求。 2)刪除最後一行中的「pid」,只是「按m,s desc排序」; 到目前爲止的輸出在這裏看起來不錯。 你覺得呢? – joeyy27 2014-10-08 23:47:32