我正在构建一个用于财务预算规划的应用,而且我现在正在打墙。在应用程序中,用户应该每个月预算他的财务。
他增加了交易 - 收入和支出 - 他分别为每个类别分配预算,即杂货500美元。每次他在杂货上花钱时,都会从500美元中减去。但也有可能他花在杂货上的费用超过预算(=超支),甚至可能他甚至在他的整个类别中预算的钱比他实际预算的多(=过度预算)。
问题是:我不知何故需要处理理论上无限量的先前数据。因为前几个月用户超支或预算过多的一切都需要直到现在才流行。这意味着:如果用户在1月份超支500美元并且尚未对其进行补偿,那么500美元仍然需要在6月截断他的可用预算。
现在通过上个月的数据来计算这个月的数据并不是一个大问题,但我只计算上个月的正确数据。这似乎是无休止的循环。
数据库结构的简化版本如下所示:
"种类"表
id |标题
BUDGETS TABLE
category_id | budget_date(2017-06)|量
交易表
id | ...... |日期(2017-06-17)| category_id |流出|流入
你对如何前进有任何想法吗?我希望我没有忽略类似的问题,但我甚至不确定我在寻找什么。我只需要找到一种方法来正确计算每个月的可用预算,无论超支/过度预算在历史上走多远。
非常感谢你。
编辑:我已经添加了我构建的查询,但它似乎无法正常工作,但却提供了错误的结果。有关如何改进的想法吗?
SELECT category AS category_id,
SUM(outflow) AS outflows,
SUM(inflow) AS inflows,
SUM(amount) AS amounts,
SUM(amount) - SUM(inflow) - SUM(outflow) AS total
FROM transactions
LEFT JOIN budgets ON (transactions.category = budgets.cat_id
AND DATE_FORMAT(transactions.date, "%Y-%m") =
DATE_FORMAT(budgets.date, "%Y-%m"))
WHERE DATE_FORMAT(transactions.date, "%Y-%m") < "' . $date . '"
GROUP BY transactions.category ASC
答案 0 :(得分:0)
我认为问题在于您的查询包含每个交易行的一个预算行,因此总结了一个预算行。相反,它应该每个类别只包含一次预算行。
这假设对于预算表中的给定月/年日期,每个类别只有一行。
SELECT category AS category_id,
SUM(a.outflow) AS outflows,
SUM(a.inflow) AS inflows,
b.amount AS amounts,
b.amount - SUM(a.inflow) - SUM(a.outflow) AS total
FROM transactions a
LEFT JOIN budgets b
ON a.category = b.cat_id
AND DATE_FORMAT(MAX(a.date), "%Y-%m") = DATE_FORMAT(b.date, "%Y-%m")
WHERE DATE_FORMAT(a.date, "%Y-%m") < "' . $date . '"
GROUP BY a.category ASC, b.amount