Oracle 用于将付款与余额进行比较的查询

Oracle 用于将付款与余额进行比较的查询,oracle,Oracle,有一个用于处理客户付款和计算剩余余额的应用程序。比如说,一位客户的余额为910.09美元。代理登录应用程序,向客户申请15.45美元。现在,剩下的余额是894.64美元 之后,代理人申请另一笔33.65美元的付款。余额现在是894.64-33.65=860.99 嗯,有一个继承的过程,比如说,过程X,每次应用付款时,它都会用从一开始就应用于每个处理的所有付款填充我的表 CREATE TABLE CUSTOMER_PAYMENTS ( CUSTOMER_NO NUMBER, PAYME

有一个用于处理客户付款和计算剩余余额的应用程序。比如说,一位客户的余额为910.09美元。代理登录应用程序,向客户申请15.45美元。现在,剩下的余额是894.64美元

之后,代理人申请另一笔33.65美元的付款。余额现在是894.64-33.65=860.99

嗯,有一个继承的过程,比如说,过程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;
这就是进程X运行两次后我的表的状态。现在,我的挑战是确定独特的付款方式。我如何比较支付后的余额,看看它是否真的是那个数字,如果不是,我会说这是重复的

在本例中,第三行894.64-15.45!=860.99. 因此,第二行15.45是重复的


提前感谢。

如评论中所述,我认为这个问题无法可靠回答,因为无法确定订单。如果假设剩余余额应该减少,这可能会让您看到一些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
[这里。]


[我在这里做了很多假设-比如rem_余额总是在减少,而且从来没有正常的99999999999,等等]

您的客户付款表是否有主键,或者任何指示付款插入顺序的内容?否。同样,这是从第三方继承的。您说过第三行……因此,第二行是重复的。一旦进入数据库,就没有第三行或第二行,除非您对结果进行排序。要回答@Gerrat的问题,您需要一种理智的方式来区分付款。我不会说出我对流程X的看法:-如果没有正确的记录顺序,这将变得非常不可能。。您能否在表上添加一个触发器,以某种方式标记一个ID,使您能够知道正确的顺序?或者是否有其他表可以连接到具有正确顺序的表?@tbone,为了这个示例,我使用了行号。在Q/A环境中,我第一次运行该流程时,它创建了44条记录。申请付款,然后再次运行该过程,然后我有44+45=89条记录。是!剩余余额必须减少。我想你已经了解了一些事情,但我得到了一个错误:第9行ORA-00904错误:下一个余额:无效标识符OK,我添加了另一个级别-现在更好了?rem\u balance>=下一个余额-付款金额>0繁荣!我觉得有点不对劲,所以我调整了一下,添加了一个SQL提琴。