是否可以编写一个SQL查询,该查询会自动对帐/“交易”付款和费用

dba.stackexchange https://dba.stackexchange.com/questions/3415

  •  16-10-2019
  •  | 
  •  

我仍在此处提到的项目(http://dba.stackexchange.com/questions/2428/how-do-i-properly-design-a-many-to-many-to-many-charges-charges-payments-accounting-system-System-System-System-System-System )。

该系统将为用户提供选择以特定费用支付特定金额的选项,或者使通用“您弄清楚”付款。给定表结构,我们要使用的(付款,费用,付款_to_charges),我希望作弊。基本上,我正在寻找一个惊人的时髦的“和解” SQL查询,该查询将执行以下操作:

步骤1)获取剩余余额的所有付款(基本上是学分)

步骤2)以剩余余额(部分付款等)获取所有费用

步骤3)在付款_to_charges表中插入部分付款,直到不再有可用的信用额或不再收费为止。

…我想从技术上讲,这不是和解,而是创建交易数据,但是您明白了。

步骤1和2显然很容易。这是第3步,这是杀手。如果没有SQL中没有令人震惊的方法来执行此操作,我想我会选择旧的手工编码的分步循环 - 直通式交易和postepled paysection_to_charge…只是想我要问。

提前致谢!

编辑1:我想出了此查询以确定哪些费用剩余的平衡,但是这给我一个错误,说“未知列'剩余_balance'where子句'”:

SELECT 
       charges.*
     , (charges.amount - transactions.total_paid) as remaining_balance 
FROM charges
   , (SELECT 
             charge_id
           , sum(amount) as total_paid 
      FROM payments_to_charges 
      GROUP BY charge_id) as transactions 
WHERE charges.member_id = 123 
  AND charges.id = transactions.charge_id 
  AND remaining_balance > 0 
  AND charges.active_on < NOW()

我敢肯定某些项目只是不合时宜,但是我无法弄清此特定查询通常是什么问题。我应该使用而不是在哪里?我是否错过了完全明显的东西?

有帮助吗?

解决方案

您也许可以在一个SQL语句中对payemnts_to_charges进行插入,但是我不确定这是值得的。似乎这更容易在程序代码中构建,调试和维护。这样的事情:

CREATE TABLE Payments (PaymentId Number(10), Amount Number(6,2));
CREATE TABLE Charges  (ChargeID Number(10), Amount Number(6,2));
CREATE TABLE Payments_To_Charges 
   (PaymentID Number(10), ChargeID Number(10), Amount Number(6,2));

INSERT INTO Payments VALUES (1,4);
INSERT INTO Payments VALUES (2,4);

INSERT INTO Charges VALUES (1,2);
INSERT INTO Charges VALUES (2,5);
INSERT INTO Charges VALUES (3,6);
INSERT INTO Charges VALUES (4,4);
INSERT INTO Charges VALUES (5,10);

Declare
   vPaymentAmount Payments.Amount%Type;
   vAppliedAmount Payments_To_Charges.Amount%Type;
Begin
   For vPayment In (SELECT PaymentID, Amount FROM Payments) Loop
      vPaymentAmount := vPayment.Amount;      
      For vCharge In (
            SELECT ChargeID, Amount FROM
            (
               SELECT ChargeID, Amount - 
                  NVL((SELECT SUM(Amount) FROM Payments_To_Charges pc 
                       WHERE pc.ChargeID = c.ChargeID),0) Amount
               FROM Charges c            
            ) WHERE Amount > 0
         ) Loop
         vAppliedAmount := LEAST(vPaymentAmount, vCharge.Amount);
         INSERT INTO Payments_To_Charges (PaymentID, ChargeID, Amount)
            VALUES (vPayment.PaymentID, vCharge.ChargeID, vAppliedAmount);
         vPaymentAmount := vPaymentAmount - vAppliedAmount;
         If (vPaymentAmount = 0) Then
            Exit;
         End If;
      End Loop;
   End Loop;
End;
/

SELECT * FROM Payments_To_Charges;

更新:

剩余_Balance是问题。您不能在where子句中引用别名值。您可以将查询作为子查询,并在更高级别上添加该条件,也可以在Whater子句中更改剩余_Balance(cunce.Amount -transactions.total_paid)。

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top