最后效果是这样的:
收款日期 上期累计应收款 期间新增应收款 本次收款 剩余应收款
……
2013-05-10 800 500 200 1100
2013-04-20 1000 200 800列表中 期间新增应收款 的值是根据 收款日期(2013-04-20~2013-05-10) 到另外的表A中获取的,
如果是最下面一条记录,那么 期间新增应收款 为空或零,倒数第二条记录的 期间新增应收款 去他们收款日期间的和,思路类似:
select b.收款日期,b.上期累计应收款,(select xx from a where a.日期 between b.收款日期1 and b.收款日期2 ) as 期间新增应收款,b.本次收款,b.剩余应收款 from b,关键怎么样才能获取到对应的 收款日期呢

解决方案 »

  1.   

    select b.收款日期,b.上期累计应收款,(select xx from a where a.日期 between b.收款日期1 and b.收款日期2 ) as 期间新增应收款,b.本次收款,b.剩余应收款 from b where 日期 in ('日期')
      

  2.   

    或者换个问题,当前行B取前一行的A值,当前行的C取当前行的A值:
    A B C
    7 5 7
    5 3 5
    3 2 3
    2 2 2
    2 1 2
    1 0 0
    这个该怎么实现
      

  3.   

    ----------------------------------------------------------------
    -- Author  :TravyLee(物是人非事事休,欲语泪先流!)
    -- Date    :2013-06-20 15:18:26
    -- Version:
    --      Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) 
    -- Jul  9 2008 14:43:34 
    -- Copyright (c) 1988-2008 Microsoft Corporation
    -- Developer Edition on Windows NT 6.1 <X86> (Build 7600: )
    --
    ----------------------------------------------------------------
    --> 测试数据:#tb
    if object_id('tempdb.dbo.#tb') is not null drop table #tb
    go 
    create table #tb([A] int,[B] int,[C] int)
    insert #tb
    select 7,5,7 union all
    select 5,3,5 union all
    select 3,2,3 union all
    select 2,2,2 union all
    select 2,1,2 union all
    select 1,0,0
    go
    ;with t
    as(
    select px=ROW_NUMBER()over(Order by getdate()),* from #tb
    )
    select
    A,
    isnull((select A from t b where b.px=a.px-1),B) as B,
    A as C
    from  t a/*
    A B C
    -----------------------------
    7 5 7
    5 7 5
    3 5 3
    2 3 2
    2 2 2
    1 2 1
    */
    从你的字面意思理解
      

  4.   

    多谢TravyLee,效果反了,改了一下啊,把减号改成加号就好了;with t
    as(
    select px=ROW_NUMBER()over(Order by getdate()),* from #tb
    )
    select
        A,
        isnull((select A from t b where b.px=a.px+1),B) as B,
        A as C
    from  t a