预算和支票簿分类账 - 无法计算出余额远期

问题描述 投票:0回答:1

抱歉,但我无法弄清楚这一点,我通过谷歌找到的内容让我更加困惑,我是 MS SQL 的初学者。这就是我所拥有的。 两张桌子:

收入表

付款日期 金额
2025 年 1 月 1 日 2650.00
2025 年 1 月 10 日 3050.00

交易表

日期 金额 指定发薪日
2025 年 1 月 1 日 38.52 2025 年 1 月 1 日
2025 年 1 月 1 日 200.00 2025 年 1 月 1 日
2025 年 1 月 3 日 1625.00 2025 年 1 月 1 日
2025 年 1 月 5 日 428.00 2025 年 1 月 1 日
2025 年 1 月 10 日 415.00 2025 年 1 月 10 日
2025 年 1 月 11 日 151.25 2025 年 1 月 10 日

因此,收入表中的“Paydate”是与交易表的联接,因为所有费用交易都通过交易表“AssignedPayDay”字段分配给收入表中的“PayDate”。

我想做的是获取查询,该查询将汇总每个发薪日的所有交易,减去它们并将任何余额结转到下一个发薪日。

我能够进行查询,计算每个指定发薪日的交易总额,然后减去它们以获得该发薪日的余额,但我不知道如何将剩余余额保留到下一个发薪日。 我使用了这段代码:

Select i.PayDate, i.Amount
,SUM(t.Amount) as TotalTrans
,(i.Amount - sum(t.Amount)) as Balance
From Income i
LEFT JOIN Transactions t on t.AssignedPayDay = i.PayDate
Group by Paydate, i.Amount
ORDER BY PayDate

它返回这个:

付款日期 金额 总运输 平衡
2025 年 1 月 1 日 2650.00 2291.52 358.48
2025 年 1 月 10 日 3050.00 566.25 2483.75

我不知道如何结转余额才能得到这个:

付款日期 金额 总运输 平衡
2025 年 1 月 1 日 2650.00 2291.52 358.48
2025 年 1 月 10 日 3050.00 566.25 2842.23

( 3050.00 + 358.48 - 566.25 = 2842.23 的巴尔转发)

注意:当然每个表中还有更多行。

sql-server
1个回答
0
投票

要执行递归函数,您可以使用公共表表达式。这可以帮助您结转余额,以便计算累计余额。 我在 sqliteonline 中使用以下查询并使用 PostgreSQL 尝试了您的示例。

CREATE TABLE Income (
    PayDate DATE PRIMARY KEY,
    Amount DECIMAL(10, 2) NOT NULL
);

CREATE TABLE Transactions (
    Date DATE NOT NULL,
    Amount DECIMAL(10, 2) NOT NULL,
    AssignedPayDay DATE NOT NULL,
    FOREIGN KEY (AssignedPayDay) REFERENCES Income(PayDate)
);

INSERT INTO Income (PayDate, Amount) VALUES 
('2025-01-01', 2650.00),
('2025-01-10', 3050.00);


INSERT INTO Transactions (Date, Amount, AssignedPayDay) VALUES 
('2025-01-01', 38.52, '2025-01-01'),
('2025-01-01', 200.00, '2025-01-01'),
('2025-01-03', 1625.00, '2025-01-01'),
('2025-01-05', 428.00, '2025-01-01'),
('2025-01-10', 415.00, '2025-01-10'),
('2025-01-11', 151.25, '2025-01-10');

-- TEST DATA
SELECT * FROM Income;
SELECT * FROM Transactions;


-- CTE 
WITH RECURSIVE BalanceCTE AS (
    SELECT 
        i.PayDate, 
        i.Amount,
        SUM(t.Amount) AS TotalTrans,
        (i.Amount - SUM(t.Amount)) AS Balance
    FROM 
        Income i
    LEFT JOIN 
        Transactions t ON t.AssignedPayDay = i.PayDate
    GROUP BY 
        i.PayDate, i.Amount
    ORDER BY 
        i.PayDate
),
RunningTotalCTE AS (
    SELECT 
        PayDate,
        Amount,
        TotalTrans,
        Balance,
        Balance AS RunningBalance
    FROM 
        BalanceCTE
    WHERE 
        PayDate = (SELECT MIN(PayDate) FROM BalanceCTE)
    
    UNION ALL
    
    SELECT 
        b.PayDate,
        b.Amount,
        b.TotalTrans,
        b.Balance,
        (b.Amount + rt.RunningBalance - b.TotalTrans) AS RunningBalance
    FROM 
        BalanceCTE b
    JOIN 
        RunningTotalCTE rt ON rt.PayDate = (
            SELECT MAX(PayDate) 
            FROM BalanceCTE 
            WHERE PayDate < b.PayDate
        )
)

SELECT 
    PayDate,
    Amount,
    TotalTrans,
    RunningBalance AS Balance
FROM 
    RunningTotalCTE
ORDER BY 
    PayDate;


© www.soinside.com 2019 - 2024. All rights reserved.