我现在有一张表A,三个字段:
       采购部门       cgbm
       供应商编码     gysbm 
       采购订单金额   ddje
    现在需要按采购部门统计供应商总金额的情况,当然,如果是按照采购部门直接合计所有供应商的订单金额,是很容易:
       select cgbm,sum(ddje)
       from a
       group by cgbm
 
    但是我们领导想看主力供应商的订单金额情况,所谓的主力供应商,就是指采金额排在本部门前五分之一的供应商,合计他们的订单总金额,比如,“采购一部”一共有200个供应商,“采购二部”有250个供应商,那么对“采购一部”订单金额汇总时,只汇总订单金额排在“采购一部”前40名的供应商的订单金额,而采购二部要汇总排在“采购二部”前50名供应商的订单金额。
    现在采购部门很多,每个采购部的供应商的数量也是未知,怎么去写这个SQL语句呢?
    附:如果我只查询某一个已知部门的主力供应商订单金额情况,也是比较简单
       select sum(ddje)
       from(  
         select gysbm,ddje
         from a
         where   a.cgbm='采购一部' 
         order by a.ddje desc
        )                 
       where rownum<round(0.2*(select count(*)
                               from a
                               where a.cgbm='采购一部'))   各位高手,有什么好注意,不妨告诉我,在下感激不尽。
    
    
    

解决方案 »

  1.   

    select sum(t.ddje) from
    (select cgbm,ddje,(row_number()over (partition by cgbm order by ddje DESC) ) rn 
      from a
      ) t,(select cgbm,count(*) n from a group by cgbm) m
    where t.cgbm = m.cgbm and
          t.rn<round(0.2*m.n)
    group by t.cgbm
      

  2.   

    主要是这句的含义 (row_number()over (partition by cgbm order by ddje DESC) ) rn 
    按照cgbm分组并按照ddje从大到小排列。 理解这句就不难了。另 t.rn<round(0.2*m.n) 为
    t.rn<=round(0.2*m.n) 吧