sql - MS Access查询中如何获取运行扣除金额和运行余额?
问题描述
我一直在研究这个查询一段时间(MS ACCESS 2016)......
我有两个相关的表:贷款表和扣除表
贷款表:
loan_id employee_id loan_date loan_amount is_posted
------- ----------- ---------- ----------- ---------
1 1 06/01/2019 15,000.00 True
2 4 06/01/2019 2,000.00 True
扣减表:
deduction_id loan_id deduction_date deduction_amount is_posted
------------ ------- -------------- ---------------- ---------
D1_1 1 01/15/2020 500.00 True
D1_2 1 01/30/2020 500.00 True
D1_3 1 02/15/2020 300.00 False
D1_4 1 02/28/2020 100.00 True
D2_1 2 01/15/2020 1,000.00 False
D2_2 2 01/30/2020 200.00 True
D2_3 2 02/15/2020 500.00 True
从这些表中,我试图通过查询获得 RUNNING DEDUCTION 和 RUNNING BALANCE 以获得这种结果:(我将使用 ADODB 将此结果填充到 Excel Userform ListBox 中)
运行扣除/余额查询:[这是期望的结果]
deduction_id loan_id deduction_date deduction_amount RunDeduct RunBal
------------ ------- -------------- ---------------- --------- ---------
D1_4 1 02/28/2020 100.00 1,100.00 14,400.00
D1_2 1 01/30/2020 500.00 1,000.00 14,500.00
D1_1 1 01/15/2020 500.00 500.00 15,000.00
D2_3 2 02/15/2020 500.00 700.00 1,300.00
D2_2 2 01/30/2020 200.00 200.00 1,800.00
在此示例查询中:
- 显示的唯一 DEDUCTION 记录是那些 table_deduction.is_posted=True
- 此外,查询应仅在运行扣除和运行余额的计算中包含 is_posted=True 的 deduction_amount
- 它按日期从最新到最旧排序
我试图实现的查询计算:
- 流动余额 = 贷款金额 - 扣除金额 *那么它将变成... *
- 运行余额 = 以前的余额 - (最近发布的)扣除金额
- 运行扣除=(1st)扣除金额,然后它将变成......
- 连续扣款=上一次扣款额+(最近贴出)扣款额
到目前为止,我能够使用这个获得运行总数
SELECT
TD.deduction_id,
TD.loan_id,
TD.deduction_date,
TD.deduction_amount,
(SELECT Sum(deduction_amount) FROM t_deduction WHERE TD.deduction_date >= deduction_date AND TD.loan_id = loan_id) AS RunnPaid,
TL.loan_amount-RunnPaid AS RunnBalance
FROM
t_loan AS TL
INNER JOIN
t_deduction AS TD ON TL.loan_id = TD.loan_id
ORDER BY
TD.loan_id, TD.deduction_date DESC;
但是,每当我尝试关联“t_deduction.is_posted”字段时,它就会弄乱整个查询。它仍然包括计算中的“未发布”记录。
SELECT
TD.deduction_id,
TD.loan_id,
TL.loan_amount,
TD.deduction_date,
TD.deduction_amount,
(SELECT Sum(deduction_amount) FROM t_deduction WHERE TD.deduction_date >= deduction_date AND TD.loan_id = loan_id AND TD.is_posted=True) AS RunnPaid,
TL.loan_amount-RunnPaid AS RunnBalance
FROM
t_loan AS TL
INNER JOIN
t_deduction AS TD ON TL.loan_id = TD.loan_id
WHERE
TD.is_posted = True
ORDER BY
TD.loan_id, TD.deduction_date DESC;
先感谢您。
解决方案
我认为问题出在相关子查询中“td.is_posted”的标识符范围。您可以尝试以下代码并告诉我它是否有效:
SELECT
TD.deduction_id, TD.loan_id, TL.loan_amount,
TD.deduction_date, TD.deduction_amount,
(SELECT Sum(deduction_amount) FROM t_deduction WHERE TD.deduction_date >= deduction_date AND TD.loan_id = loan_id AND is_posted) AS RunnPaid,
TL.loan_amount-RunnPaid AS RunnBalance
FROM
t_loan AS TL
INNER JOIN
(SELECT deduction_id, loan_id, deduction_date, deduction_amount
FROM t_deduction
WHERE is_posted ) AS TD
ON TL.loan_id = TD.loan_id
ORDER BY
TD.loan_id, TD.deduction_date DESC;
我假设“is_posted”是一个布尔值(或是/否)。否则,将“is_posted”替换为“is_posted = TRUE”。
推荐阅读
- python - 来自所选功能的变量存储的代码错误
- regex - RewriteRule 附加不需要的字符串
- python - Python字符串字母删除?
- php - Laravel 关系似乎不起作用
- jquery - 如何在委托中使用 jQuery 数字格式
- reactjs - Gatsby JS 中的 Netlify 函数
- algorithm - 这种嵌套 for 循环算法的时间复杂度?
- react-router - 为什么 React TestingLibrary 包裹在 MemoryRouter 中时无法渲染 DOM 节点?
- javascript - Google Drive Picker API - 显示文件夹和某些 mime 类型文件
- python - 缺少工具社区版与专业版 Pycharm