2017-01-31 12 views
0

У меня есть общие платежи в размере Store_ID s в таблице и вам необходимо оплатить/скорректировать платежи с transactions_id s для соответствующих store_id s.Корректировка платежей по остаткам некоторая id wise

Таблицы могут быть созданы следующим образом:

--- CREATE STORE_PAYMENTS TABLE--- CONTAINS RECEIVABLE AGAINST RECEIPTS NOS FOR STROES------- 
CREATE TABLE DBO.STORE_PAYMENTS 
(STORE_ID VARCHAR(10) NOT NULL, 
RECEIPT_NO VARCHAR(10) NOT NULL, 
RECEIVABLE INT NOT NULL, 
PAYMENT_ADJUSTED INT NOT NULL, 
BALANCE INT NOT NULL) 
GO 

INSERT INTO DBO.STORE_PAYMENTS 
(STORE_ID,RECEIPT_NO,RECEIVABLE,PAYMENT_ADJUSTED,BALANCE) 
VALUES 
('STR1',1,100,0,0), 
('STR1',2,200,0,0), 
('STR1',3,300,0,0), 
('STR2',1,100,0,0), 
('STR2',2,100,0,0), 
('STR2',3,50,0,0), 
('STR3',1,0,0,0), 
('STR3',2,150,0,0), 
('STR3',3,300,0,0) 

---- CREATE STORE_BALANCE TABLE --- CONTAINS INFORMATION OF IN HAND PAYMENTS ----------------- 
CREATE TABLE DBO.STORE_BALANCE 
(STORE_ID VARCHAR(10) NOT NULL, 
PAYMENTS INT NOT NULL) 
GO 

INSERT INTO DBO.STORE_BALANCE 
(STORE_ID,PAYMENTS) 
VALUES 
('STR1',600), 
('STR2',700), 
('STR3',300) 

SELECT * FROM DBO.STORE_BALANCE 
SELECT * FROM DBO.STORE_PAYMENTS 

Последовательность регулировки оплаты может быть на основании приказа RECEIPT_NO или ROWID.

Обязательный выход в Отмечена важность Столбцы:

enter image description here

+0

Совместное использование данных выборки в DDL + DML является большим, но вы также должны объяснить логику желаемых результатов, а также показать, что у вас есть уже пробовал. –

+0

Почему str2 заплатил 700 за 250 счетов? – scsimon

+0

Уважаемый Зохар, я попытался применить метод FIFO, используемый в бухгалтерском учете в SQL, но это было слишком сложно для этой проблемы. – TechPro

ответ

0
BEGIN TRAN 

--CREATE #STORE_PAYMENTS TABLE--- CONTAINS RECEIVABLE AGAINST RECEIPTS NOS FOR STROES------- 
CREATE TABLE #STORE_PAYMENTS (STORE_ID VARCHAR(10) NOT NULL, RECEIPT_NO VARCHAR(10) NOT NULL, RECEIVABLE INT NOT NULL, PAYMENTS INT NOT NULL, BALANCE INT NOT NULL) 
    GO 

INSERT INTO #STORE_PAYMENTS (STORE_ID,RECEIPT_NO,RECEIVABLE,PAYMENTS,BALANCE) 
SELECT 'STR1',1,100,0,0 UNION ALL 
SELECT 'STR1',2,200,0,0 UNION ALL 
SELECT 'STR1',3,300,0,0 UNION ALL 
SELECT 'STR2',1,200,0,0 UNION ALL 
SELECT 'STR2',2,300,0,0 UNION ALL 
SELECT 'STR2',3,400,0,0 UNION ALL 
SELECT 'STR3',1,0,0,0 UNION ALL 
SELECT 'STR3',2,150,0,0 UNION ALL 
SELECT'STR3',3,300,0,0 

--CREATE STORE_BALANCE TABLE --- CONTAINS INFORMATION OF IN HAND PAYMENTS ----------------- 

CREATE TABLE #STORE_BALANCE (STORE_ID VARCHAR(10) NOT NULL, PAYMENTS INT NOT NULL,TMP_PAYMENTS INT NOT NULL) 

INSERT INTO #STORE_BALANCE 
SELECT 'STR1',500,500 UNION ALL 
SELECT 'STR2',700,700 UNION ALL 
SELECT 'STR3',300,300 

SELECT ROW_NUMBER()Over(Order by Store_ID)RowNum,* INTO #T FROM #STORE_BALANCE --Order by RowNum desc 
SELECT DENSE_RANK()OVER(Order by STORE_ID)RANK, ROW_NUMBER()Over(Order by Store_ID)RowNum, * INTO #TT FROM #STORE_PAYMENTS 

Declare @strt INT ,@End INT 
SELECT TOP 1 @strt=RowNum FROM #t 
SELECT @End=MAX(RowNum) FROM #t 

While @strt<[email protected] 
Begin 
    DECLARE @RANK INT=1,@Rownum INT,@Payments INT,@RECEIVABLE INT,@Total_RECEIVABLE INT 
    SELECT @Rownum=MAX(RECEIPT_NO)FROM #TT WHERE [email protected] 

       WHILE @RANK<[email protected] 
        BEGIN 

          SELECT @Payments=Tmp_Payments FROM #T WHERE [email protected] 
          SELECT @RECEIVABLE=RECEIVABLE FROM #TT WHERE [email protected] AND RECEIPT_NO [email protected] 

           IF @Payments >= @RECEIVABLE 
             Begin 

              UPDATE #TT SET [email protected] WHERE [email protected] AND RECEIPT_NO = @RANK 

              UPDATE #T SET [email protected]@RECEIVABLE 
                FROM #t Inner Join #tt ON #t.RowNum=#TT.RANK 
                WHERE [email protected] AND [email protected] 

           END ELSE BEGIN 

               UPDATE #TT SET PAYMENTS [email protected] WHERE [email protected] AND RECEIPT_NO = @RANK 

               SELECT @Total_RECEIVABLE=SUM(Payments) FROM #TT WHERE [email protected]  

               UPDATE #T SET TMP_PAYMENTS = @[email protected] 
                 FROM #t Inner Join #tt ON #t.RowNum=#TT.RANK 
                 WHERE [email protected] AND [email protected] 

           END 
           -- Select * from #TT WHERE [email protected] AND RECEIPT_NO = @RANK 
           SET @[email protected]+1 
        END 

    SET @[email protected]+1 
END 

    UPDATE #STORE_PAYMENTS SET PAYMENTS=T.PAYMENTS,BALANCE=T.RECEIVABLE-T.PAYMENTS 
    FROM #STORE_PAYMENTS S INNER JOIN #TT T ON S.STORE_ID=T.STORE_ID AND S.RECEIPT_NO=T.RECEIPT_NO 

    SELECT * FROM #STORE_PAYMENTS 

ROLLBACK TRAN 
+1

Спасибо Alfaiz, я застрял в том, как это можно сделать, и ваше решение сработало. Ваш предоставленный ответ также понятен. Пальцы вверх! – TechPro

+0

Добро пожаловать @TechPro –