2015-05-04 76 views
2

我需要计算indebtedness列的值,以便当openingBalance !=0 then indebtedness = openingBalnce+SalesTotal-SalesReturn。但是,当openingBalnce = 0 then indebtedness = indebtedness的前monthSalesSalesID相同。如果previous value = 0得到previous value并继续得到previous value,直到此列有值:递归Sql查询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.

And this is the output i want. 
 

 
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

可以添加销售月= 1和销售ID = 1的预期产出 – ughai

+0

Indebtednes = 346600 –

+0

我的意思是期望样本输出包含基于问题中上述样本输入的数据。您可以编辑问题并为salesMonth = 1和SalesID = 1添加详细信息 – ughai

回答

0

您可以执行CROSS APPLY或共同相关的子查询。像这样的东西。 SQL Fiddle

样本数据

DECLARE @Sales TABLE (SalesMonth INT,SalesID INT,openingBalance MONEY,SalesTotal MONEY,SalesReturn MONEY,Indebtednes MONEY) 
insert into @Sales 
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) 

选择查询

SELECT C1.SalesMonth,C1.SalesID,C1.openingBalance,C1.SalesTotal,C1.SalesReturn,C2.Indebt 
FROM @Sales C1 
CROSS APPLY (
SELECT TOP 1 CASE WHEN openingBalance = 0 THEN NULL ELSE openingBalance + SalesTotal - SalesReturn END Indebt 
FROM @Sales C2 WHERE C2.SalesID = C1.SalesID AND openingBalance <> 0 AND C2.SalesMonth <=C1.SalesMonth ORDER BY SalesMonth Desc 
) C2 

更新查询

UPDATE C1 
SET Indebtednes = 
(
SELECT TOP 1 CASE WHEN openingBalance = 0 THEN NULL ELSE openingBalance + SalesTotal - SalesReturn END Indebt 
FROM @Sales C2 WHERE C2.SalesID = C1.SalesID AND openingBalance <> 0 AND C2.SalesMonth <=C1.SalesMonth ORDER BY SalesMonth Desc 
) 
FROM @Sales C1 

SELECT * FROM @Sales 
+0

请再次查看我的帖子,并给我答案,我编辑帖子与我的输出我想,谢谢你的帮助:) –