2015-05-04 49 views
0

我需要计算债务列的值,以便当openingBalance !=0 then indebtedness = openingBalnce+SalesTotal-SalesReturn。但是,当openingBalnce = 0那么债务=上一个monthSales具有相同SalesID的债务。如果以前的值= 0获得前值,并继续获得前值,直到此列有值: 如何在sql Server 2008中进行递归查询

SalesMonth SalesID openingBalance SalesTotal SalesReturn Indebtednes 
 
    ---------- ------- -------------- ---------- ----------- ------------ 
 
    1   1    352200  0   5600   Null 
 
    ------------------------------------------------------------------------ 
 
    1   2    50000  1100   0    Null 
 
    ------------------------------------------------------------------------ 
 
    1   3    9500  6000   0    Null 
 
    ------------------------------------------------------------------------ 
 
    2   1    0   0   1200   Null 
 
    ------------------------------------------------------------------------ 
 
    2   2    0   300   0    Null 
 
    ------------------------------------------------------------------------ 
 
    2   3    0   500  1000   Null 
 
    ------------------------------------------------------------------------ 
 
    3   1    0   600   0    NULL 
 
    ------------------------------------------------------------------------ 
 
    3   2    0   200   0    NULL 
 
    ----------------------------------------------------------------------- 
 
    3   3    0   0   10    NULL 
 
    ----------------------------------------------------------------------- 
 
    . 
 
    . 
 
    . 
 
    12   1    0   0   0    NULL 
 
    ---------------------------------------------------------------------- 
 
    12   2    0   0   0    NULL 
 
    ---------------------------------------------------------------------- 
 
    12   3    0   0   0    NULL
与输出是这样的:

when openingBalance !=0 then Indebtednes=openingBalnce+SalesTotal-SalesReturn 

    when openingBalnce =0 then Indebtednes=Indebtednes (of the previous 
    month of the same SalesID)+SalesTotal-SalesReturn. 

这是我想要的输出。

SalesMonth SalesID openingBalance SalesTotal SalesReturn Indebtednes 
 
    ---------- ------- -------------- ---------- ----------- ------------ 
 
    1   1    352200  0   5600   346600 
 
    ------------------------------------------------------------------------ 
 
    1   2    50000  1100   0    51100 
 
    ------------------------------------------------------------------------ 
 
    1   3    9500  6000   0    15500 
 
    ------------------------------------------------------------------------ 
 
    2   1    0   0   1200   345400 
 
    ------------------------------------------------------------------------ 
 
    2   2    0   300   0    51400 
 
    ------------------------------------------------------------------------ 
 
    2   3    0   500  1000   15000 
 
    ------------------------------------------------------------------------ 
 
    3   1    0   600   0    346000 
 
    ------------------------------------------------------------------------ 
 
    3   2    0   200   0    51600 
 
    ----------------------------------------------------------------------- 
 
    3   3    0   0   10    14990 
 
    ----------------------------------------------------------------------- 
 
    . 
 
    . 
 
    . 
 
    12   1    0   0   0    NULL 
 
    ---------------------------------------------------------------------- 
 
    12   2    0   0   0    NULL 
 
    ---------------------------------------------------------------------- 
 
    12   3    0   0   0    NULL

+0

对这个问题的任何帮助,请 –

回答

0

你可以尝试像下面CTE查询

declare @tb table(SalesMonth int,SalesID int, 
openingBalance money,SalesTotal money,SalesReturn money,Indebtednes money) 
insert into @tb(SalesMonth,SalesID,openingBalance,SalesTotal,SalesReturn,Indebtednes) 
values (1,1,352200,0,5600,Null) 
     ,(1,2,50000,1100,0,Null) 
     ,(1,3,9500,6000,0,Null) 
     ,(2,1,0,0,1200,Null) 
     ,(2,2,0,300,0,Null) 
     ,(2,3,0,500,1000,Null) 
     ,(3,1,0,600,0,NULL) 
     ,(3,2,0,200,0,NULL) 
     ,(3,3,0,0,10,NULL) 


    ;with t1 as (select *, row_number() over 
    (order by salesid,SalesMonth) as rno from @tb), 
    t2(inde,rno,salid,mnth)as 
    (select case when openingBalance !=0 then 
    openingBalance+SalesTotal-SalesReturn 
    when openingBalance =0 then 0 end as inde, 
    rno,SalesID,SalesMonth from t1 where rno=1 
    union all 
    select case when openingBalance !=0 then 
    openingBalance+SalesTotal-SalesReturn 
    when openingBalance =0 then 
    case when SalesID=salid then inde+SalesTotal-SalesReturn 
    else 0 end end, 
    t1.rno,t1.SalesID,SalesMonth from t2 join t1 on t2.rno+1=t1.rno ) 
    select SalesMonth,SalesID,openingBalance, 
    SalesTotal,SalesReturn,inde as Indebtednes from t1 
    inner join t2 on t1.SalesID=t2.salid and 
    t1.SalesMonth=t2.mnth order by mnth,salid