明智地根据余额调整付款
Adjusting payments against balances some id wise
我在 table 中有 Store_ID
的总付款,需要 settle/adjust 为 transactions_id
相应的 store_id
付款。
可以创建如下表:
--- 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_NOorder或者rowid
突出显示的列中需要的输出:
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<=@End
Begin
DECLARE @RANK INT=1,@Rownum INT,@Payments INT,@RECEIVABLE INT,@Total_RECEIVABLE INT
SELECT @Rownum=MAX(RECEIPT_NO)FROM #TT WHERE RANK=@strt
WHILE @RANK<=@Rownum
BEGIN
SELECT @Payments=Tmp_Payments FROM #T WHERE RowNum=@strt
SELECT @RECEIVABLE=RECEIVABLE FROM #TT WHERE RANK=@strt AND RECEIPT_NO =@RANK
IF @Payments >= @RECEIVABLE
Begin
UPDATE #TT SET PAYMENTS=@RECEIVABLE WHERE RANK=@strt AND RECEIPT_NO = @RANK
UPDATE #T SET TMP_PAYMENTS=@Payments-@RECEIVABLE
FROM #t Inner Join #tt ON #t.RowNum=#TT.RANK
WHERE RECEIPT_NO=@RANK AND RANK=@strt
END ELSE BEGIN
UPDATE #TT SET PAYMENTS =@Payments WHERE RANK=@strt AND RECEIPT_NO = @RANK
SELECT @Total_RECEIVABLE=SUM(Payments) FROM #TT WHERE RANK=@strt
UPDATE #T SET TMP_PAYMENTS = @Total_RECEIVABLE-@Payments
FROM #t Inner Join #tt ON #t.RowNum=#TT.RANK
WHERE RANK=@strt AND RECEIPT_NO=@RANK
END
-- Select * from #TT WHERE RANK=@strt AND RECEIPT_NO = @RANK
SET @RANK=@RANK+1
END
SET @strt=@strt+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
我在 table 中有 Store_ID
的总付款,需要 settle/adjust 为 transactions_id
相应的 store_id
付款。
可以创建如下表:
--- 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_NOorder或者rowid
突出显示的列中需要的输出:
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<=@End
Begin
DECLARE @RANK INT=1,@Rownum INT,@Payments INT,@RECEIVABLE INT,@Total_RECEIVABLE INT
SELECT @Rownum=MAX(RECEIPT_NO)FROM #TT WHERE RANK=@strt
WHILE @RANK<=@Rownum
BEGIN
SELECT @Payments=Tmp_Payments FROM #T WHERE RowNum=@strt
SELECT @RECEIVABLE=RECEIVABLE FROM #TT WHERE RANK=@strt AND RECEIPT_NO =@RANK
IF @Payments >= @RECEIVABLE
Begin
UPDATE #TT SET PAYMENTS=@RECEIVABLE WHERE RANK=@strt AND RECEIPT_NO = @RANK
UPDATE #T SET TMP_PAYMENTS=@Payments-@RECEIVABLE
FROM #t Inner Join #tt ON #t.RowNum=#TT.RANK
WHERE RECEIPT_NO=@RANK AND RANK=@strt
END ELSE BEGIN
UPDATE #TT SET PAYMENTS =@Payments WHERE RANK=@strt AND RECEIPT_NO = @RANK
SELECT @Total_RECEIVABLE=SUM(Payments) FROM #TT WHERE RANK=@strt
UPDATE #T SET TMP_PAYMENTS = @Total_RECEIVABLE-@Payments
FROM #t Inner Join #tt ON #t.RowNum=#TT.RANK
WHERE RANK=@strt AND RECEIPT_NO=@RANK
END
-- Select * from #TT WHERE RANK=@strt AND RECEIPT_NO = @RANK
SET @RANK=@RANK+1
END
SET @strt=@strt+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