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.9640B表以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
不知道我这么说说明白没,求大神 高手解决!!在线等,急!!!!

解决方案 »

  1.   

    这是楼主要的吗?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);
      

  2.   

    SELECT B.PRICE*A.FACTOR FROM A, B 
    WHERE A.SECCODE=B.SECCODE
      AND A.DATE>B.DATE
      

  3.   

    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]
      

  4.   

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