考验高手,ORACLE数据统计问题!!急!!!!!!!!!

draco2002 2004-10-05 09:32:19
在ORACLE8i中有个表,结构及数据如下:

部门 a项销售额 b项销售额 销售总额
A 1 1 2
B 3 3 6
C 5 5 10
B 2 2 4
A 6 4 10

销售总额分别是各部门的a,b两项的和,现在的问题是我想得到各部门
的a,b两小项占所有部门销售总额之和(2+6+10+4+10=32)的一个比例,
类似结果是:

部门 a项销售额之和 b项销售额 a占销售总额比例 b占销售总额比例
A 1+6=7 1+4=5 7/32 5/32
B 3+2=5 3+2=5 5/32 5/32
c 5 5 5/32 5/32

我这样写:

select 部门,sum(销售总额),sum(a项销售额),round((SUM(a项销售额)/sum(销售总额))*100,2) as a占销售总额比例 from table group by 部门

但这样得到的sum(销售总额)只是把相同部门的进行累加,而不是全部部门的数据,
这样的语句该怎么写,最好不用存储过程,能够一句话实现!,谢谢 !

...全文
173 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
draco2002 2004-10-06
  • 打赏
  • 举报
回复
zmgowin(隐者(龙祖宗)) ,你好

我还有一个问题想请教,就是我想把 销售总额之和(2+6+10+4+10=32)也作为一列显示出来,该怎么写!!!
waxle 2004-10-05
  • 打赏
  • 举报
回复
上面的不行啊,关键是GROUP BY后怎么得出总量。
fightintokyo 2004-10-05
  • 打赏
  • 举报
回复
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 部门;


fightintokyo 2004-10-05
  • 打赏
  • 举报
回复
不好意思,没看清楚你的需求。不过我的方法还是可以用的。这次经过调试,结果正确。
原理是 各项部门别占销售总额比例 = 各项部门别占各项销售总额比例 * 各项总额占销售总额比例

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了。
waxle 2004-10-05
  • 打赏
  • 举报
回复
嗯,不过我觉得没有什么更好的办法!!
draco2002 2004-10-05
  • 打赏
  • 举报
回复
呵呵,高手越来越多,
zmgowin(隐者(龙祖宗)) 的方法是正确的,就是太复杂了,我的表有15列(a,b,c,.......)
照你的写法要很长,不过终于能实现了!!!!
draco2002 2004-10-05
  • 打赏
  • 举报
回复
发现新问题!!!!!
fightintokyo(黑龙),你好,我又用你的方法仔细测试了一下,你得到的a占销售总额比例分别是:

对A部门结果是:(1+6)/(1+3+5+2+6),即分母是"项销售额"一列的和,而我要的是"销售总额"的和,

即:(1+6)/32

你不妨试一下就知道了
zmgowin 2004-10-05
  • 打赏
  • 举报
回复
你这里所占销售总额比例指的是a和b的全部为总量,fightintokyo(黑龙)的这种写法只是计算的a或者b的总量,应该是:
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 10

SQL> 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

draco2002 2004-10-05
  • 打赏
  • 举报
回复
啊,确实可行,上午没仔细调试!!,谢谢 fightintokyo(黑龙) !!

对ORACLE不熟悉,能讲一下:RATIO_TO_REPORT(sum(a项销售额)) OVER () AS a占销售总额比例

这句话的工作原理吗??

还有,我想把 销售总额之和(2+6+10+4+10=32)也作为一列显示出来,该怎么写!!!

万分感谢!!!
fightintokyo 2004-10-05
  • 打赏
  • 举报
回复
谁说我的方法不行?执行过么?

RATIO_TO_REPORT(sum(a项销售额)) OVER ()
over后面没有条件,应该是求占总量的比例。

这是oracle在8.1.6以后的Enterprise Edition支持的新功能。

我现在的环境没法执行,等我晚上回家后测试一下,把结果发上来。


draco2002 2004-10-05
  • 打赏
  • 举报
回复
没错, fightintokyo(黑龙) 的方法不能计算总量,希望大家再想想办法!
waxle 2004-10-05
  • 打赏
  • 举报
回复
GROUP BY 以后如果再用查询也应该都是按照部门统计的!所以用一个语句可能很难

17,078

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧