我想用jasperreports做一个报告,该报告汇总我们一个月内的合同,但是将所有新旧合同添加到该月中。该数据库是一个mysql数据库。
我的SELECT看起来像下面的示例数据:
SELECT month(contract_date), amount
FROM contracts
WHERE year(contract_date)=2013
GROUP BY month(contract_date)
1.1.2013 300
1.1.2013 500
1.2.2013 250
1.3.2013 250
现在我得到:
1 800
2 250
3 250
...
但我想拥有:
1 800
2 1050
3 1300
...
因此,每个月包含前一个月的所有金额。
我不在乎我是否可以在SQL中或使用jasperreports / iReport进行此操作,因此欢迎任何解决方案。
有什么办法可以做到吗?
最佳答案
MySQL没有不方便的CTE,但是视图会紧紧抓住。
create view MonthlyTotals as
select Month( ContractDate ) as ContractMonth, Sum( ContractQty ) as TotalQty
from contracts
group by ContractMonth;
现在,我们可以将视图与其自身连接起来,并保持该月和之前所有月的运行总计:
select t1.ContractMonth, t1.TotalQty, Sum( t2.TotalQty ) as RunningTotal
from MonthlyTotals t1
join MonthlyTotals t2
on t2.ContractMonth <= t1.ContractMonth
group by t1.ContractMonth;
输出与您所需的输出匹配,如SQL Fiddle所示。