如上图,需求描述如下:
数据库表product_price中存放这产品(product)的价格(price)修改记录,其中每条记录有使用该价格的起止时间(beginDate 和 endDate),每次修改价格,都将前一价格的endDate写为新价格的beginDate,新价格的endDate为空。现在给定时间段,1、将价格有修改的日期列出来,并将该日期下所有产品的最新价格列出来,即有修改的列出修改后的,没修改的列出之前的最新价格。(图中红色代表价格调高,绿色调低)
2、每月1号无论是否修改价格,将所有产品的最新价格列出来。求教这样的需求如何实现?或者可以写出这样的中间表吗?
小弟在线等,望不吝赐教!

解决方案 »

  1.   

    图是你想要的格式吧,把表的结构贴下
    另外:每次修改价格,都将前一价格的endDate写为新价格的beginDate,新价格的endDate为空。这个每次修改时应该是insert 一条记录吧?
      

  2.   

    create table test_a
    (
     p_id varchar2(20),
     price number,
     begdate varchar2(20),
     enddate varchar2(20)
    );insert into TEST_A (P_ID, PRICE, BEGDATE, ENDDATE)
    values ('a', 300, '2011-03-06', '2011-03-10');
    insert into TEST_A (P_ID, PRICE, BEGDATE, ENDDATE)
    values ('a', 200, '2011-03-10', '2011-03-12');
    insert into TEST_A (P_ID, PRICE, BEGDATE, ENDDATE)
    values ('a', 300, '2011-03-12', null);
    insert into TEST_A (P_ID, PRICE, BEGDATE, ENDDATE)
    values ('b', 100, '2011-03-07', '2011-03-10');
    insert into TEST_A (P_ID, PRICE, BEGDATE, ENDDATE)
    values ('b', 200, '2011-03-10', '2011-03-15');
    insert into TEST_A (P_ID, PRICE, BEGDATE, ENDDATE)
    values ('b', 300, '2011-03-15', '2011-03-25');
    insert into TEST_A (P_ID, PRICE, BEGDATE, ENDDATE)
    values ('b', 350, '2011-03-25', null);
    insert into TEST_A (P_ID, PRICE, BEGDATE, ENDDATE)
    values ('c', 100, '2011-03-07', '2011-03-09');
    insert into TEST_A (P_ID, PRICE, BEGDATE, ENDDATE)
    values ('d', 200, '2011-03-10', '2011-03-11');
    insert into TEST_A (P_ID, PRICE, BEGDATE, ENDDATE)
    values ('d', 300, '2011-03-11', '2011-03-30');
    insert into TEST_A (P_ID, PRICE, BEGDATE, ENDDATE)
    values ('d', 350, '2011-03-30', null);
    insert into TEST_A (P_ID, PRICE, BEGDATE, ENDDATE)
    values ('c', 120, '2011-03-09', null);
    commit;declare
    v_sql varchar2(4000):='select p_id, ';
    begin
    for x in(select distinct enddate from test_a t where enddate>'2011-03-09' and enddate is not null order by enddate)
      loop
         v_sql:=v_sql||'NVL((select price from test_a where p_id=t.p_id and begdate='''||x.enddate||'''),
                          (select distinct first_value(price) over(order by BEGDATE desc) from test_a where p_id=t.p_id and begdate<'''||x.enddate||''')),';
      end loop;
      v_sql:=v_sql||'from (select distinct p_id  from test_a) t';
      dbms_output.put_line(v_sql);
    end;
      

  3.   

    由于日期列不是固定的 ,需要通过动态SQL实现,生成动态列。