2017-06-17 23 views
1

我正在構建財務預算計劃的應用程序,現在我正在打牆。在應用程序中,用戶應該每個月都要預算他的財務狀況。檢索並處理無限量的數據

他增加了交易 - 收入和支出 - 他將預算分配給他的每個類別,即雜貨500美元。每次他在雜貨上花費的時候,都會從這500美元中扣除。但他也有可能在雜貨上花費超過他的預算(=超支),甚至他甚至可以在他的類別中比他實際上預算更多的錢(=過度預算)。

問題是:我以某種方式需要處理理論上無限量的以前的數據。因爲前幾個月用戶超支或過度預算的一切都需要流血直到今天。這意味着:如果用戶在1月份超過了500美元並且還沒有得到補償,這些500美元仍然需要在6月份削減他的可用預算。

現在通過上個月的數據計算本月的數據並不是一個很大的問題,但是在計算上個月的數據時我只能得到上個月的正確數據。這似乎是無止境的循環。

數據庫結構的簡化版本如下所示:

「類別」 表

ID |標題

收支表

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

您需要計算欠款(負數或正數)的「淨額」,並將其應用於該月的可用資金。 – Rogue

+0

您可以按類別進行分組,獲得所有交易的總和。無論他們在一個月內是否超支,都是無關緊要的 - 因爲他們會平衡出來,表明他們違反預算 - 如果您加入預算並乘以月數。你也可以做2個查詢:過去的月份和當前的月份,以顯示當前與歷史。 –

+0

@SloanThrasher謝謝。我試過所有的東西,但它看起來不像我構建查詢的方式那樣工作。你介意在上面看一下嗎? – Alexander

回答

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 
+0

你真棒,謝謝! – Alexander

+0

很高興爲你效勞! –