日期:2014-05-16  浏览次数:20825 次

关于oracle两个表的计算问题,高手来答啊!!!
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


不知道我这么说说明白没,求大神 高手解决!!在线等,急!!!!


------解决方案--------------------
这是楼主要的吗?
SQL code

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

------解决方案--------------------
参考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里分组后没有相乘的方法,所以使用对数做一个转换

探讨
这个貌似不行吧?我说是累乘,这个只能乘一次
引用:
SELECT B.PRICE*A.FACTOR FROM A, B
WHERE A.SECCODE=B.SECCODE
AND A.DATE>B.DATE