select 
    a.交易日期,
    a.币种,
    a.交易金额 * (select top 1 兑率 from 兑换率表 where 公布日期 < a.交易日期 order by 公布日期 desc)
from 
    交易表 a

解决方案 »

  1.   

    select 
        a.交易日期,
        a.币种,
        a.交易金额 * (select  兑率 from 兑换率表 where 公布日期 =a.交易日期)
    from 
        交易表 a
      

  2.   

    select top 1  b.交易日期,a.币种,金额=a.兑率*b.交易金额 from  兑换率表 a,交易表 b
    where a.公布日期<=b.交易日期
    order by a.公布日期 desc
      

  3.   

    楼上这个SQL对于币种这个问题好象没有解决好,呵呵,如果客户选择人民币交易呢
      

  4.   

    为了跟上进度,我用游标解决了这个问题,但是速度会很慢。大家继续讨论这个问题~~ libin_ftsafe(子陌红尘) :
    你是指与现实生活中的兑率不对??这个问题我们就不要关心了。我们只关心逻辑正确即可。
      

  5.   

    我关心的是兑换率表和交易表中币种字段的关系,如果单纯是美金兑换成人民币的兑换数据,直接用楼下的代码即可:
    -----------------------------------------------------------------------------
    select 
        a.交易日期,
        a.币种,
        a.交易金额 * (select 
                           top 1 兑率 
                      from 
                           兑换率表 
                      where 
                           公布日期 < a.交易日期 
                      order by 
                           公布日期 desc)
    from 
        交易表 a
    -----------------------------------------------------------------------------
    倘若不是,我觉得应当是两个表的币种字段应当一致,才能兑换,那么应用如下SQL语句:
    -----------------------------------------------------------------------------
    select 
        a.交易日期,
        a.币种,
        a.交易金额 * (select  
                           top 1 兑率 
                      from 
                           兑换率表 
                      where 
                           公布日期 < a.交易日期 and 币种 = a.币种 
                      order by 
                           公布日期 desc)
    from 
        交易表 a
    -----------------------------------------------------------------------------
      

  6.   

    --DROP Table 兑换率表
    Create  Table  兑换率表 (公布日期  datetime, 币种  varchar(5),兑率  decimal(8,1))
    insert  into  兑换率表
    select '1900-1-1','RMB',7  
    UNION select '2000-1-1','RMB',8
    UNION select '2005-1-1','RMB',9
    go--DROP Table 交易表
    Create  Table  交易表 (交易日期  datetime, 币种  varchar(5), 交易金额 Money )
    go--处理的触发器
    create trigger tr_insert on 交易表
    instead of insert
    as
    if @@rowcount=0 return
    select * into #t from inserted
    update a set 交易金额=a.交易金额*b.兑率
    from #t a,兑换率表 b
    where a.交易日期>=b.公布日期
    and not exists(
    select * from 兑换率表
    where a.交易日期>=公布日期
    and 公布日期>b.公布日期)
    insert  into  交易表 select * from #t
    go--插入数据
    insert  into  交易表
    select '2004-1-1','USD',300
    go--显示结果
    select * from 交易表
    go--删除测试
    drop table 交易表,兑换率表/*--测试结果
    交易日期                    币种   交易金额     
    -------------------------- ------ -------------
    2004-01-01 00:00:00.000    USD    2400.0000(所影响的行数为 1 行)
    --*/
      

  7.   

    Create  Table  兑换率表 (公布日期  datetime, 币种  varchar(5),兑率  decimal(8,1))
    insert  into  兑换率表
    select '1900-1-1','RMB',7  
    UNION select '2000-1-1','RMB',8
    UNION select '2005-1-1','RMB',9--DROP Table 交易表
    Create  Table  交易表 (交易日期  datetime, 币种  varchar(5), 交易金额 Money )
    insert  into  交易表
    select '2004-1-1','USD',300
    insert  into  交易表
    select '2004-1-1','RMB',300
    insert  into  交易表
    select '2001-1-1','RMB',320
    insert  into  交易表
    select '2003-1-1','RMB',200insert  into  交易表
    select '1999-1-1','RMB',200
    insert  into  交易表
    select '2005-1-2','RMB',200select * from 兑换率表
    select * from 交易表
    begin tran
      declare @mtype  varchar(10)
      set @mtype = 'RMB'
      
      select id=identity(int),a.*,0 as rate into #tm from 交易表 a where 币种 = @mtype  declare @tranBDate datetime
      declare @tranEDate datetime
      declare @rate int
      
      declare cur_do cursor for select 公布日期,兑率 from 兑换率表 where 币种=@mtype
      open cur_do
      fetch next from cur_do into @tranBDate,@rate
      while (@@rowcount > 0)
      begin
        select @tranEDate=isnull(min(公布日期),convert(datetime,'2999-12-31')) from 兑换率表 where 币种=@mtype and 公布日期 > @tranBDate
        update #tm set rate = @rate where 交易日期 > @tranBDate and 交易日期<=@tranEDate
        fetch next from cur_do into @tranBDate,@rate   
      end
      close cur_do
      deallocate cur_do
       
      select 交易日期,币种,交易金额 *rate As 交易总金额 from #tm
    rollback tran
      

  8.   

    交易表中可能存各种各样的实际交易币种,如USD,RMB