是否可以编写一个SQL查询,该查询会自动对帐/“交易”付款和费用
-
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)。