2017-03-17 47 views
1

我想回報按月彙總賬戶的餘額,按帳戶和月份分組。例如,給定一個交易表,看起來像這樣:SQL查詢按月返回分組列的總和,包括所有之前的日期

| date  | account_id | trans_amount | 
| 2012-01-01 |   1 |  -2500 | 
| 2012-01-01 |   2 |  -2500 | 
| 2016-01-01 |   1 |   5000 | 
| 2016-01-01 |   2 |   5000 | 
| 2016-02-01 |   1 |   7500 | 
| 2016-02-01 |   2 |   7500 | 

我想查詢返回:

| month | year | account_id | balance | 
| 01 | 2012 |   1 | -2500 | 
| 01 | 2012 |   2 | -2500 | 
| 01 | 2016 |   1 | 2500 | 
| 01 | 2016 |   2 | 2500 | 
| 02 | 2016 |   1 | 10000 | 
| 02 | 2016 |   2 | 10000 | 

我開始用這樣的:

SELECT MONTH(date), YEAR(date), account_id, SUM(trans_amount) 
FROM transactions 
GROUP BY account_id, MONTH(date), YEAR(date); 

當然,但在分組期間給出了變化,而不是包括期間之前的交易在內的餘額。

+0

其中'amount_cents'從何而來? – LONG

+0

良好的捕獲 - 應該是'trans_amount'。編輯。 – MattH

回答

1

最簡單的方法將是一個嵌套查詢。類似這樣的:

SELECT MONTH(date) as month, YEAR(date) as year, account_id, (select SUM(trans_amount) from transactions t2 where t1.date>=t2.date and t1.account_id = t2.account_id) as balance 
FROM transactions t1 
GROUP BY account_id, MONTH(date), YEAR(date); 

您很可能需要修復一些語法。我也不完全確定日期與分組的匹配程度,因此您可能需要爲內部選擇構建合成日期。

+0

給予好評此,豎起大拇指 – LONG

+0

嗯 - 當我嘗試,我得到「表達#SELECT列表中的4是不是在GROUP BY子句中包含非聚合列‘database_name.t1.date’,這並不功能依賴於在組列條款;這是不兼容的sql_mode = only_full_group_by」 – MattH

+0

你可以嘗試建立從月份和年份的日期,然後使用在內部select語句。但你必須從那裏解決它。另一種選擇是將嘗試「按組」最初例如去除,並得到它的工作而沒有再逐漸增加複雜性回 –

相關問題