抱歉,但我无法弄清楚这一点,我通过谷歌找到的内容让我更加困惑,我是 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 的巴尔转发)
注意:当然每个表中还有更多行。
要执行递归函数,您可以使用公共表表达式。这可以帮助您结转余额,以便计算累计余额。 我在 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;