原数据如下:
分公司    公事处    客户名    销售额
分A       办A       客A       10000
分A       办A       客A       20000
分A       办A       客B       10000
分A       办B       客C       20000想得出一个这样的分类汇总结果:分公司    公事处    客户名    销售额    本订单在该客户总占比   本订单在办事处总占比    本订单在分公司总占比
分A       办A       客A       10000     0.333333               0.25                    0.166666
分A       办A       客A       20000     0.666666               0.5                     0.333333
分A       办A       客B       10000     1                      0.25                    0.166666
分A       办B       客C       20000     1                      1                       0.333333
我现在用的方法是分别对三个层级的数据进行Group by,再进行表关联,但是由于数据量较大,这样表关联比较慢,不知道高手们是不是有其它更好的办法解决呢?

解决方案 »

  1.   

    不好意思,本来格式弄得挺好的,给CSDN给搞乱了,请大伙将就着看看了~~
      

  2.   

    分析函数
    SQL> select * from test;
     
    分公司     公事处     客户名                       销售额
    ---------- ---------- ---------- ---------------------
    分A        办A        客A                        10000
    分A        办A        客A                        20000
    分A        办A        客B                        10000
    分A        办B        客C                        20000
     
    SQL> 
    SQL> SELECT  分公司, 公事处, 客户名, 销售额,销售额/SUM(销售额)OVER(PARTITION BY 客户名) 本订单在该客户总占比,
      2          销售额/SUM(销售额)OVER(PARTITION BY 分公司,公事处) 本订单在办事处总占比,
      3          销售额/SUM(销售额)OVER(PARTITION BY 分公司) 本订单在分公司总占比
      4  FROM  TEST;
     
    分公司     公事处     客户名                       销售额           本订单在该客户总占比           本订单在办事处总占比           本订单在分公司总占比
    ---------- ---------- ---------- --------------------- -------------------- -------------------- --------------------
    分A        办A        客A                        10000    0.333333333333333                 0.25    0.166666666666667
    分A        办A        客A                        20000    0.666666666666667                  0.5    0.333333333333333
    分A        办A        客B                        10000                    1                 0.25    0.166666666666667
    分A        办B        客C                        20000                    1                    1    0.333333333333333
     
    SQL> 
      

  3.   


    with b as 
    (
    (select 分公司, 
            公事处 ,
            客户名,
            sum(销售额) over(partition by 分公司) 分公司销售额,
            sum(销售额) over(partition by 公事处) 公事处销售额,
            sum(销售额) over(partition by 客户名) 客户名销售额,
     rownum from your_table)
    )
    select 分公司, 
           公事处 ,
           客户名 ,
           销售额,
           销售额/客户名销售额,
           销售额/公事处销售额,
           销售额/分公司销售额
    from your_table a,
         (select 分公司, 
                 公事处 ,
                 客户名 ,
                 max(客户名销售额) 客户名销售额,
                 max(公事处销售额) 公事处销售额,
                 max(分公司销售额)分公司销售额 
          from b
          group by 
                分公司, 
                公事处 ,
                客户名 )
    where a.分公司 = b.分公司
          and a.公事处 = b.公事处
          and a.客户名 = c.客户名