在sql查询中的fifo

时间:2017-12-20 05:17:54

标签: sql excel

是否有可能找到那些在未来日期不会与总和信用额相关的负数。

FIFO in sql

sample gur.com/pcwhp.png

1 个答案:

答案 0 :(得分:0)

我不确定您是在寻找Excel解决方案还是SQL,因为如果没有唯一键,很难使用SQL。假设每个交易都有唯一的ID字段,我会尽量给你一些建议。

首先计算帐户的所有正面变化(这将是解决方案的一部分,但我为了清楚起见将其拆分)。

SELECT 
    t.account, 
    SUM(t.debit) AS change_positive 
FROM 
    transactions AS t 
WHERE 
    t.debit > 0 
GROUP BY 
    t.account

现在您将按帐户获得已恢复借记的总价值。在这种情况下 35 (10 + 5 +20)

现在你必须对借记(负面改变)进行类似的操作,但仅限于当前操作,例如。对于12/21/2017它是-20,对于12/25/2017它是-55。当您拥有debits_till_date的价值时,您将知道payment_total是否已支付该付款,或者是否已经支付过多的债务。在SQL中作为总查询(包括前一个查询),它看起来像这样:

SELECT
    q.account,
    q.date,
    q.transaction_debit,
    q.remainings_from_payments
FROM
    (
        SELECT
            t.account,
            t.date,
            t.debit AS transaction_debit,
            SUM(t2.debit) AS debits_till_date,
            i.payments_total,
            SUM(t2.debit) + i.payments_total AS remainings_from_payments
        FROM
            transactions AS t
        LEFT JOIN transactions AS t2 ON t.account = t2.account AND t.date >= t2.date AND t2.debit < 0
        LEFT JOIN (SELECT t.account, SUM(t.debit) AS payments_total FROM transactions AS t WHERE t.debit > 0 GROUP BY t.account) AS i ON t.account =     i.account
        GROUP BY
            t.account, t.date
    ) AS q
    WHERE
        q.transaction_debit < 0
        AND q.remainings_from_payments < 0

如果您删除最后一部分“AND q.remainings_from_payments&lt; 0”,您将能够看到每次负面交易后仍有多少付款。

SQLFiddle DEMO