oracle中累计求和_请教一个累计求和的sql

本文探讨了在Oracle中进行累计求和时遇到的问题,即当某些区域在特定月份没有数据时,如何确保这些区域在累计求和中仍然显示。通过一个SQL查询示例展示了如何在分区按年累计求和的基础上,填充缺少的区域数据,以达到期望的查询结果。
摘要由CSDN通过智能技术生成

请问一个累计求和的sql

按年累计值的sql一般是这样:

with t as

(select 201401 as month_id, 1 as region_id, 10 as cal_data

from dual

union

select 201401, 2, 20

from dual

union

select 201402, 1, 30 from dual

union

select 201403, 1, 40 from dual)

select month_id, region_id, cal_data, sum(cal_data) over(partition by region_id,substr(month_id,1, 4)

order by month_id) lj

from t

查询结果是:

MONTH_IDREGION_IDCAL_DATALJ

420140122020

120140111010

220140213040

320140314080

现在的问题是,由于2014年2月、3月只有region_id为1的数据,所以累计时,没有region_id为2的数据,我想要的数据是这样的:

20140122020

20140111010

20140213040

2014022020

20140314080

2014032020

请问,应该怎么写sql

------解决方案--------------------

引用:按年累计值的sql一般是这样:

with t as

(select 201401 as month_id, 1 as region_id, 10 as cal_data

from dual

union

select 201401, 2, 20

from dual

union

select 201402, 1, 30 from dual

union

select 201403, 1, 40 from dual)

select month_id, region_id, cal_data, sum(cal_data) over(partition by region_id,substr(month_id,1, 4)

order by month_id) lj

from t

查询结果是:

MONTH_IDREGION_IDCAL_DATALJ

420140122020

120140111010

220140213040

320140314080

现在的问题是,由于2014年2月、3月只有region_id为1的数据,所以累计时,没有region_id为2的数据,我想要的数据是这样的:

20140122020

20140111010

20140213040

2014022020

20140314080

2014032020

请问,应该怎么写sql

with t as

(select 201401 as month_id, 1 as region_id, 10 as cal_data

from dual

union

select 201401, 2, 20

from dual

union

select 201402, 1, 30

from dual

union

select 201403, 1, 40

from dual)

select month_id,

region_id,

cal_data,

sum(cal_data) over(partition by region_id, substr(month_id, 1, 4) order by month_id) lj

from (select tt1.month_id, tt1.region_id, nvl(tt2.cal_data, 0) cal_data

from (select month_id, region_id

from (select distinct month_id from t) t1,

(select distinct region_id from t) t2) tt1,

t tt2

where tt1.month_id = tt2.month_id(+)

and tt1.region_id = tt2.region_id(+))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值