2013-05-30 40 views
0

有處理客戶付款和計算餘額的應用程序。假設客戶的餘額爲910.09美元。代理登錄到應用程序會向客戶申請15.45美元。現在剩下的餘額是894.64美元。用於比較支付餘額的查詢

後來,代理人申請了另一筆33.65美元的付款。餘額現在是894.64 - 33.65 = 860.99。

那麼,有一個繼承過程(比如說Process X),每次應用一次付款時,它會在開始時爲我的表填充所有在每次處理時應用的付款。

CREATE TABLE CUSTOMER_PAYMENTS 
(
    CUSTOMER_NO NUMBER, 
    PAYMENT_DATE DATE, 
    PAYMENT_AMT NUMBER(20,4), 
    REM_BALANCE NUMBER(20,4) 
) 
NOCOMPRESS 
NOCACHE 
NOPARALLEL 
MONITORING; 
SET DEFINE OFF; 
Insert into CUSTOMER_PAYMENTS 
    (CUSTOMER_NO, PAYMENT_DATE, PAYMENT_AMT, REM_BALANCE) 
Values 
    (4926, TO_DATE('05/30/2013 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), -15.45, 894.64); 
Insert into CUSTOMER_PAYMENTS 
    (CUSTOMER_NO, PAYMENT_DATE, PAYMENT_AMT, REM_BALANCE) 
Values 
    (4926, TO_DATE('05/30/2013 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), -15.45, 860.99); 
Insert into CUSTOMER_PAYMENTS 
    (CUSTOMER_NO, PAYMENT_DATE, PAYMENT_AMT, REM_BALANCE) 
Values 
    (4926, TO_DATE('05/30/2013 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), -33.65, 860.99); 
COMMIT; 

這就是我的表格在Process X運行兩次之後變成的東西。現在,我的挑戰是確定獨特的付款。如何在應用付款後比較餘額,看看是否真的是這個數字,如果不是,我會說這是重複的?

在這種情況下,第3行894.64 - 15.45!= 860.99。因此,第2行15.45是重複的。

在此先感謝。

+0

您的Customer_Payments表是否有一個主鍵或任何可以指示付款插入的順序的東西? – Gerrat

+0

沒有。同樣,這是從第三方繼承的。 – CFNinja

+0

你說「第三排......因此,第二排是重複的」。一旦進入分貝,沒有第三排或第二排,除非你要訂購結果。對於@Gerrat問題,您需要一種理智的方式來區分付款。我不會說我對Process X的看法:-) – tbone

回答

1

正如在評論中提到的,我不認爲這可以被可靠地回答,因爲沒有辦法確定排序。如果一個人假設剩下的餘額應該減少,這可能給你一些的DUP在尋找:

SELECT customer_no, payment_date, payment_amt, rem_balance, prev_bal 
FROM (
    SELECT customer_no, payment_date, payment_amt, rem_balance,  
    LAG(rem_balance, 1, 0) OVER 
    (PARTITION BY customer_no ORDER BY rem_balance DESC) prev_bal, 
    rownum r 
    FROM customer_payments 
    ORDER BY rem_balance DESC 
) 
WHERE r > 1 and 
prev_bal + payment_amt <> rem_balance 
ORDER BY customer_no, rem_balance DESC 

[我做很多假設,這裏雖然 - [SQL Fiddle在這裏。]像rem_balance始終在減少,並且從不999999999999正常,等等。]

+0

是的!剩餘的餘額必須減少。我認爲你正在做的事情,但我得到一個錯誤:第9行錯誤 ORA-00904:「NEXT_BAL」:無效標識符 – CFNinja

+0

好吧,我又增加了一個級別 - 現在好點? – Gerrat

+0

where rem_balance> = next_bal - AND payment_amt> 0 BOOM! – CFNinja