在SQL中按月生成年度报告

时间:2011-09-14 15:11:29

标签: sql date group-by db2

  

可能重复:
  Running total by grouped records in table

我正在尝试将一个SQL语句放在一起,该语句按月返回值的SUM,但是以年初为基础。换句话说,对于3月份,我希望获得1月,2月和3月的价值总和。

我可以轻松地通过组来获取每个月的总数,并可以通过循环结果集从这些数据计算我的应用程序中所需的年初至今值。但是,我希望能用SQL语句处理这些工作。

有没有人用SQL语句解决过这类问题,如果有的话,我错过了什么诀窍?

我当前的月度数据sql语句类似于以下内容:

Select month, year, sum(value) from mytable group by month, year

如果我在月份中包含where子句,并且只按年份分组,我可以获得我想要的单个月的结果:

select year, sum(value) from mytable where month <= selectedMonth group by year

但是,这要求我预先选择一个特定月份,或者使用12个不同的SQL语句来生成一个干净的结果集。

非常感谢任何可以提供的指导!

更新:数据存储在IBM iSeries上。

4 个答案:

答案 0 :(得分:2)

declare @Q as table 
(
mmonth INT,
value int 
)

insert into @Q
values
(1,10),
(1,12),
(2,45),
(3,23)

select sum(January) as UpToJanuary, 
sum(February)as UpToFebruary,
sum(March) as UpToMarch from (
select 
case when mmonth<=1 then sum(value) end as [January] ,
case when mmonth<=2 then sum(value) end as [February],
case when mmonth<=3 then sum(value) end as [March]
from @Q
group by mmonth
) t

制作:

UpToJanuary UpToFebruary    UpToMarch
22          67              90

你明白了,对吗?

注意:使用PIVOT表可以更轻松地完成此操作,但我不知道您是否使用SQL Server。

答案 1 :(得分:1)

create table mon
(
[y] int not null,
[m] int not null,
[value] int not null,
primary key (y,m))

select a.y, a.m, a.value, sum(b.value) 
from mon a, mon b 

where a.y = b.y and a.m >= b.m
group by a.y, a.m, a.value 

2011    1   120 120
2011    2   130 250
2011    3   500 750
2011    4   10  760
2011    5   140 900
2011    6   100 1000
2011    7   110 1110
2011    8   90  1200
2011    9   70  1270
2011    10  150 1420
2011    11  170 1590
2011    12  600 2190

答案 2 :(得分:1)

据我所知,DB2确实支持窗口函数,但我不知道iSeries版本是否也支持它。

如果支持窗口函数(我相信IBM称之为OLAP函数),那么以下内容应该返回您想要的内容(前提是我正确理解了您的问题)

select month, 
       year, 
       value,
       sum(value) over (partition by year order by month asc) as sum_to_date
from mytable 
order by year, month 

答案 3 :(得分:0)

您应该尝试按一个月后的条件将表连接到自身,并生成合成的月份组代码,按如下方式分组:

 select 
  sum(value),
  year,
  up_to_month
 from (
    select a.value,
           a.year, 
           b.month as up_to_month
     from table as a join table as b on a.year = b.year and b.month => a.month
 ) 
 group by up_to_month, year

给出了:

db2 =&gt;从my.rep中选择*

VALUE       YEAR        MONTH      
----------- ----------- -----------
    100        2011           1
    200        2011           2
    300        2011           3
    400        2011           4

db2 -t -f rep.sql

1           YEAR        UP_TO_MONTH
----------- ----------- -----------
    100        2011           1
    300        2011           2
    600        2011           3
   1000        2011           4