我想用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所示。

09-17 02:28