原数据如下:
分公司 公事处 客户名 销售额
分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,再进行表关联,但是由于数据量较大,这样表关联比较慢,不知道高手们是不是有其它更好的办法解决呢?
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>
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.客户名