select
    a.人员id,
    a.人员姓名,
    a.现有分值,
    isnull(b.执行前分值,a.现有分值) as 初始分值 
from
    表1 a
left join
    (select t.* from 表2 t where not exists(select 1 from 表2 where 人员id=t.人员id and 加减分时间<t.加减分时间)) b
where
    a.人员id=b.人员id
order by
    a.id

解决方案 »

  1.   

    SELECT a.*,
    a.现有分值 - (ISNULL(TotalChange,0)) 初始分值
    FROM t1 a
    LEFT JOIN
    (SELECT 人员ID,SUM(执行后分值 - 执行前分值) TotoalChange FROM t2 GROUP BY 人员ID) b
    ON a.人员ID=b.人员ID
      

  2.   

    declare @t1 table(id int,人员id int,人员姓名 varchar(10),现有分值 int)
    insert into @t1 values(1,1,'a',5 )
    insert into @t1 values(2,2,'b',12) 
    insert into @t1 values(3,3,'c',3 )declare @t2 table(id int,人员id int,加减分时间 datetime,执行前分值 int,执行后分值 int)
    insert into @t2 values(1,1,'2007-8-2',10, 5)
    insert into @t2 values(2,1,'2007-8-1',2 ,10)
    insert into @t2 values(3,2,'2007-9-1',8 ,12)
    select
        a.人员id,
        a.人员姓名,
        a.现有分值,
        isnull(b.执行前分值,a.现有分值) as 初始分值 
    from
        @t1 a
    left join
        (select t.* from @t2 t where not exists(select 1 from @t2 where 人员id=t.人员id and 加减分时间<t.加减分时间)) b
    on
        a.人员id=b.人员id
    order by
        a.id/*
    人员id        人员姓名       现有分值        初始分值        
    ----------- ---------- ----------- ----------- 
    1           a          5           2
    2           b          12          8
    3           c          3           3
    */
      

  3.   

    TotalChange多加了一个o.手误,自己改一下
      

  4.   

    我在第一个SQL写错了一处,left join 应该与 on 一起使用,而不是 where ,修正一下:
    declare @t1 table(id int,人员id int,人员姓名 varchar(10),现有分值 int) 
    insert into @t1 values(1,1,'a',5 ) 
    insert into @t1 values(2,2,'b',12) 
    insert into @t1 values(3,3,'c',3 ) declare @t2 table(id int,人员id int,加减分时间 datetime,执行前分值 int,执行后分值 int) 
    insert into @t2 values(1,1,'2007-8-2',10, 5) 
    insert into @t2 values(2,1,'2007-8-1',2 ,10) 
    insert into @t2 values(3,2,'2007-9-1',8 ,12) 
    select 
        a.人员id, 
        a.人员姓名, 
        a.现有分值, 
        isnull(b.执行前分值,a.现有分值) as 初始分值 
    from 
        @t1 a 
    left join 
        (select t.* from @t2 t where not exists(select 1 from @t2 where 人员id=t.人员id and 加减分时间 <t.加减分时间)) b 
    on 
        a.人员id=b.人员id 
    order by 
        a.id /* 
    人员id      人员姓名   现有分值    初始分值       
    ----------- ---------- ----------- ----------- 
    1           a          5           2 
    2           b          12          8 
    3           c          3           3 
    */
      

  5.   

    借老大的数据.declare @t1 table(id int,人员id int,人员姓名 varchar(10),现有分值 int) 
    insert into @t1 values(1,1,'a',5 ) 
    insert into @t1 values(2,2,'b',12) 
    insert into @t1 values(3,3,'c',3 ) declare @t2 table(id int,人员id int,加减分时间 datetime,执行前分值 int,执行后分值 int) 
    insert into @t2 values(1,1,'2007-8-2',10, 5) 
    insert into @t2 values(2,1,'2007-8-1',2 ,10) 
    insert into @t2 values(3,2,'2007-9-1',8 ,12) 
    SELECT a.*,
        a.现有分值 - (ISNULL(TotalChange,0)) 初始分值
        FROM @t1 a
    LEFT JOIN
        (SELECT 人员ID,SUM(执行后分值 - 执行前分值) TotalChange FROM @t2 GROUP BY 人员ID) b
        ON a.人员ID=b.人员ID
    /*
    1 1 a 5 2
    2 2 b 12 8
    3 3 c 3 3
    */
      

  6.   

    首先谢谢两位技艺超群的老兄。因为原来的数据有的地方不全,所以 fcuandy 老兄的加减法还是用不了。libin_ftsafe 提供的方法可以运行。 但是现在每个表里面的数据都有 1万多条,运行下来要2分钟28秒能否再一下速呢?请赐教。
      

  7.   

    嗯.加减法,实际上是把你的t2当做分值变更记录来处理的, 结果得出了某个人员分值总的浮动量. 那么当前值减去浮动量,就是初始量.
    确实依赖变更记录,如果变更记录不全,那么初始值计算就不对.可以试着将子陌老大的子查询加not exist的方法改为聚合连表,连接的性能比较稳定,不随匹配率变化(或变化较低),能不能比not exists快,就看你的数据了.SELECT a.*,
    ISNULL(b.执行前分值,a.执行前分值) 初始分值
    FROM @t1 a
    LEFT JOIN
    (
    SELECT x.* FROM @t2 x
    INNER JOIN 
    (SELECT 人员id,MIN(加减分时间) mt 
    FROM @t2 GROUP BY 人员ID) y
    ON x.人员id=y.人员id AND 加减分时间=mt
    ) b
    ON a.人员id=b.人员id
      

  8.   


    declare   @t1   table(id   int,人员id   int,人员姓名   varchar(10),现有分值   int) 
    insert   into   @t1   values(1,1,'a',5   ) 
    insert   into   @t1   values(2,2,'b',12)   
    insert   into   @t1   values(3,3,'c',3   ) declare   @t2   table(id   int,人员id   int,加减分时间   datetime,执行前分值   int,执行后分值   int) 
    insert   into   @t2   values(1,1,'2007-8-2',10,   5) 
    insert   into   @t2   values(2,1,'2007-8-1',2   ,10) 
    insert   into   @t2   values(3,2,'2007-9-1',8   ,12) 
    /*
    人员id 人员姓名 现分值 初始分值 
    1 a 5 2 
    2 b 12 8 
    3 c 3 3
    */
    select c.人员id,人员姓名,现有分值,isnull(执行前分值,现有分值) 初始分值 from @t1 c left join
    (select 人员id,执行前分值 from @t2 a where not exists(select 1 from @t2 where a.执行前分值=执行后分值 and 人员id=a.人员id))b
    on c.人员id=b.人员id
      

  9.   

    declare   @t1   table(id   int,人员id   int,人员姓名   varchar(10),现有分值   int) 
    insert   into   @t1   values(1,1,'a',5   ) 
    insert   into   @t1   values(2,2,'b',12)   
    insert   into   @t1   values(3,3,'c',3   ) declare   @t2   table(id   int,人员id   int,加减分时间   datetime,执行前分值   int,执行后分值   int) 
    insert   into   @t2   values(1,1,'2007-8-2',10,   5) 
    insert   into   @t2   values(2,1,'2007-8-1',2   ,10) 
    insert   into   @t2   values(3,2,'2007-9-1',8   ,12) 
    select a.*, (isnull((select top 1 [执行前分值]
         from @t2
         where [人员id] = a.[人员id]
         order by [加减分时间]), a.[现有分值])) as [初始分值] 
    from @t1 a 
      

  10.   

    谢谢各位热情的老兄。子陌红尘、fcuandy、Lyw110 三位老兄的SQL都可以得到结果。其中fcuandy的执行效率最高,现在结贴了,再次谢谢各位老兄。SELECT a.*,
        ISNULL(b.执行前分值,a.执行前分值) 初始分值
        FROM @t1 a
    LEFT JOIN
        (
            SELECT x.* FROM @t2 x
            INNER JOIN 
                (SELECT 人员id,MIN(加减分时间) mt 
                    FROM @t2 GROUP BY 人员ID) y
                ON x.人员id=y.人员id AND 加减分时间=mt
        ) b
        ON a.人员id=b.人员id