我正在尝试将一个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上。
答案 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