2015-05-04 4 views
2

Мне нужно вычислить значение столбца indebtedness так, чтобы при openingBalance !=0 then indebtedness = openingBalnce+SalesTotal-SalesReturn. Но, когда openingBalnce = 0 then indebtedness = indebtedness предыдущего monthSales с тем же SalesID. Если 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

вы можете добавить ожидаемый результат также – ughai

+0

для продажMonth = 1 и SalesID = 1 Indebtednes = 346600 –

+0

Я имею в виду ожидаемый вывод проб с данными, основанными на приведенном выше примере ввода в вопрос. вы можете отредактировать вопрос и добавить детали – 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 Query

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

, пожалуйста, просмотрите мой пост и дайте мне ответ, я отредактировал сообщение с моим выходом, я хочу, спасибо за помощь мне :) –

Смежные вопросы