select 部门,sum(a项销售额),sum(b项销售额),
RATIO_TO_REPORT(sum(a项销售额)) OVER () AS a占销售总额比例,
RATIO_TO_REPORT(sum(b项销售额)) OVER () AS b占销售总额比例
from table
group by 部门;
RATIO_TO_REPORT(sum(a项销售额)) OVER () AS a占销售总额比例,
RATIO_TO_REPORT(sum(b项销售额)) OVER () AS b占销售总额比例
from table
group by 部门;
over后面没有条件,应该是求占总量的比例。这是oracle在8.1.6以后的Enterprise Edition支持的新功能。我现在的环境没法执行,等我晚上回家后测试一下,把结果发上来。
SQL> select * from t1; A项销售额 B项销售额 销售总额
- ---------- ---------- ----------
A 1 1 2
B 3 3 6
C 5 5 10
B 2 2 4
A 6 4 10SQL> select
2 a.部门,a.a项销售额之和,a.b项销售额之和,b.a占销售总额比例,b.b占销售总额比
例
3 from
4 (select 部门,sum(a项销售额) a项销售额之和,sum(b项销售额) b项销售额之和 fr
om t1 group by 部门) a,
5 (select 部门,sum(a项销售额/(select sum(销售总额) 销售总额 from t1)) a占销
售总额比例,
6 sum(b项销售额/(select sum(销售总额) 销售总额 from t1)) b占销
售总额比例 from t1 group by 部门) b
7 where a.部门=b.部门; A项销售额之和 B项销售额之和 A占销售总额比例 B占销售总额比例
- ------------- ------------- --------------- ---------------
A 7 5 .21875 .15625
B 5 5 .15625 .15625
C 5 5 .15625 .15625
fightintokyo(黑龙),你好,我又用你的方法仔细测试了一下,你得到的a占销售总额比例分别是:对A部门结果是:(1+6)/(1+3+5+2+6),即分母是"项销售额"一列的和,而我要的是"销售总额"的和,即:(1+6)/32你不妨试一下就知道了
zmgowin(隐者(龙祖宗)) 的方法是正确的,就是太复杂了,我的表有15列(a,b,c,.......)
照你的写法要很长,不过终于能实现了!!!!
原理是 各项部门别占销售总额比例 = 各项部门别占各项销售总额比例 * 各项总额占销售总额比例Select 部门, a项销售额, b项销售额, 销售总额,
a项总额占销售总额比例* a项部门别销售比例 as a占销售总额比例,
b项总额占销售总额比例* b项部门别销售比例 as b占销售总额比例
From ( select sum(a项销售额)/ sum(销售总额) as a项总额占销售总额比例,
sum(b项销售额)/ sum(销售总额) as b项总额占销售总额比例,
sum(销售总额) as销售总额
from table
),
( select 部门,
sum(a项销售额) as a项销售额,
sum(b项销售额) as b项销售额,
RATIO_TO_REPORT(sum(a项销售额)) OVER () AS a项部门别销售比例,
RATIO_TO_REPORT(sum(b项销售额)) OVER () AS b项部门别销售比例
from table
group by 部门
);特别是如果你想求某一段时间内的各项部门别占销售总额比例时,在OVER ()中指定条件就OK了。