检斤单
车号       过磅时间        净重      合同编号
111111   2013-03-01   36.90    H001
222222   2013-03-04   38.25    H001
333333   2013-03-07   40.23    H001
444444   2013-03-09   38.40    H001合同
编号     单价
H001   1080补充协议
编号     生效时间         合同编号    单价
B001   2013-03-03     H001     1070
B002   2013-03-05     H001     1060
B003   2013-03-08     H001     1040需要结果
车号       过磅时间        净重      合同编号    单价    总金额
111111   2013-03-01   36.90    H001      1080 39852
222222   2013-03-04   38.25    H001      1070 40927.5
333333   2013-03-07   40.23    H001      1060 42643.8
444444   2013-03-09   38.40    H001      1040 39936
这样的SQL应该怎样实现?多表

解决方案 »

  1.   

    关键在于构建一个价格区间,根据你的需求,最新检斤单的价格应该以大于补充协议日期为准(如果有)(暂时这么理解),
    那么SQLcode应该类似如下:select a.合同号,a.过磅时间,a.净重,price_zone.单价 ,a.净重*price_zone.单价 money
    from 检斤单 a
    join
    (
      select 合同号,lead(生效日期) over(order by 生效日期 desc)  startday,
         生效日期 endday,单价 
      from ( 
        SELECT 合同号,19000101 生效日期,单价 from 合同    
        union all
        SELECT 合同号,30000101 生效日期,单价 from 合同    
        union all
        select  合同号,生效日期,单价 from 补充协议
      )
    ) price_zone on price_zone.合同号=a.合同号 
        and a.过磅时间 between price_zone.startday and price_zone.endday
    更好的方式是定义一个视图,避免代码的复杂,视图可以是普通的,也可以是物化的。