关于oracle两个表的计算问题,高手来答啊!!!

一条大红龙 2012-07-11 11:33:17
A表以SECCODE和DATE为主键,有如下纪录:
SECCODE DATE FACTOR
6000 2007-7-18 0.9958
6000 2008-4-24 0.7656
6000 2009-6-9 0.7090
6000 2010-6-10 0.7632
6000 2011-6-3 0.7600
6000 2012-6-26 0.9640

B表以SECCODE和DATE为主键,有如下纪录
SECCODE DATE PRICE
6000 2008-4-01 15
6000 2008-4-12 16
6000 2009-4-12 17
6000 2011-4-12 13
6000 2012-4-12 16

现在要做的事情是:
取出A表与B表SECCODE相同的纪录,取出DATE字段,与B表的DATE字段进行比较,B表中DATE所有小于A表取出的DATE的纪录,做如下处理:PRICE*FACTOR。
举个例子:
对于B表中的6000 2009-4-12 17纪录,
因为A表中有
6000 2009-6-9 0.7090
6000 2010-6-10 0.7632
6000 2011-6-3 0.7600
6000 2012-6-26 0.9640
4条记录的DATE大于2009-4-12,所以B表的PRICE做的处理是:17*0.7090*0.7632*0.7600*0.9640


不知道我这么说说明白没,求大神 高手解决!!在线等,急!!!!
...全文
203 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
smnzg 2012-07-18
  • 打赏
  • 举报
回复
参考2楼的思想,使用log和指数的方式
SELECT B.PRICE*EXP(SUM(LN(A.FACTOR)))
FROM A, B
WHERE A.SECCODE=B.SECCODE
AND A.DATE>B.DATE
GROUP BY B.PRICE

这样写的原理是:
lg(1*2*3*4) = lg1 + lg2 + lg3 + lg4
因为ORACLE里分组后没有相乘的方法,所以使用对数做一个转换

[Quote=引用 4 楼 的回复:]
这个貌似不行吧?我说是累乘,这个只能乘一次
引用 3 楼 的回复:
SELECT B.PRICE*A.FACTOR FROM A, B
WHERE A.SECCODE=B.SECCODE
AND A.DATE>B.DATE
[/Quote]
一条大红龙 2012-07-17
  • 打赏
  • 举报
回复
2楼,你这个sql文我有点没看懂……log(10)是以10为底数的对数值,
power(10, sum(log(10, a.factor)))是算出10的sum(log(10, a.factor))次方,我没太懂和我的这个算法有什么关系……17*0.7090*0.7632*0.7600*0.9640,你能详细解释下吗?
我的思路是,循环B表的纪录,对于每一条纪录,在A表中取出所有日期大于的纪录集合,然后把集合里的factor取出来,乘以B表的price。这样能帮我写一条吗?

Quote=引用 1 楼 的回复:]
这是楼主要的吗?

SQL code


select b.price * (select power(10, sum(log(10, a.factor)))
from a
where a.a_date > b.b_date)
from b

附表创建及数据插入语句

SQL code

……
[/Quote]
一条大红龙 2012-07-17
  • 打赏
  • 举报
回复
这个貌似不行吧?我说是累乘,这个只能乘一次
[Quote=引用 3 楼 的回复:]
SELECT B.PRICE*A.FACTOR FROM A, B
WHERE A.SECCODE=B.SECCODE
AND A.DATE>B.DATE
[/Quote]
smnzg 2012-07-17
  • 打赏
  • 举报
回复
SELECT B.PRICE*A.FACTOR FROM A, B
WHERE A.SECCODE=B.SECCODE
AND A.DATE>B.DATE
Aquarius_Uranus 2012-07-14
  • 打赏
  • 举报
回复
2楼太牛了,数学牛人
lithor 2012-07-11
  • 打赏
  • 举报
回复
这是楼主要的吗?

select b.price * (select power(10, sum(log(10, a.factor)))
from a
where a.a_date > b.b_date)
from b

附表创建及数据插入语句

create table a (
seccode number(12),
a_date date,
factor number(6,4)
);

create table b (
seccode number(12),
b_date date,
price number(12)
);

insert into a values(6000,to_date('2007-07-18','yyyy-mm-dd'),0.9958);
insert into a values(6000,to_date('2008-04-24','yyyy-mm-dd'),0.7656);
insert into a values(6000,to_date('2009-06-09','yyyy-mm-dd'),0.7090);
insert into a values(6000,to_date('2010-06-10','yyyy-mm-dd'),0.7632);
insert into a values(6000,to_date('2011-06-03','yyyy-mm-dd'),0.7600);
insert into a values(6000,to_date('2012-06-26','yyyy-mm-dd'),0.9640);

insert into b values(6000,to_date('2008-04-01','yyyy-mm-dd'),15);
insert into b values(6000,to_date('2008-04-12','yyyy-mm-dd'),16);
insert into b values(6000,to_date('2009-04-12','yyyy-mm-dd'),17);
insert into b values(6000,to_date('2011-04-12','yyyy-mm-dd'),13);
insert into b values(6000,to_date('2012-04-12','yyyy-mm-dd'),16);

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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