2017-03-17 81 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语句。但你必须从那里解决它。另一种选择是将尝试“按组”最初例如去除,并得到它的工作而没有再逐渐增加复杂性回 –

相关问题