请教一个月累计的问题,请高手解答,谢谢!

[复制链接]
查看11 | 回复9 | 2014-2-18 16:43:09 | 显示全部楼层 |阅读模式
本帖最后由 520NET 于 2015-7-2 15:01 编辑
结构如下:
年月金额
2015.01 2
2015.02 3
2015.03 6
2015.04 7
结果如下:
起始月份截止月份金额
2015.01 2015.012
2015.01 2015.025(2+3)
2015.01 2015.0311(2+3+6)
2015.01 2015.0418(2+3+6+7)
2015.02 2015.023
2015.02 2015.039(3+6)
2015.02 2015.0416(3+6+7)
2015.03 2015.036
2015.03 2015.0413(6+7)
2015.04 2015.047

回复

使用道具 举报

千问 | 2014-2-18 16:43:09 | 显示全部楼层
with tmp as (
select '2015.01' dt, 2 value from dual union all
select '2015.02', 3 from dual union all
select '2015.03', 6 from dual union all
select '2015.04', 7 from dual
)
select t1.dt begin_dt,t2.dt end_dt,sum(t2.value) over (partition by t1.dt order by t2.dt) sum_value fromtmp t1,tmp t2 where t2.dt>=t1.dt
union
select t3.dt,t3.dt,t3.value from tmp t3
order by begin_dt;
回复

使用道具 举报

千问 | 2014-2-18 16:43:09 | 显示全部楼层
太感谢了,bfc99,可以,不过大家继续看看还有没有其他的一些方法,再次感谢!
回复

使用道具 举报

千问 | 2014-2-18 16:43:09 | 显示全部楼层
这种问题没什么意义。。。
回复

使用道具 举报

千问 | 2014-2-18 16:43:09 | 显示全部楼层
520NET 发表于 2015-7-2 15:24
太感谢了,bfc99,可以,不过大家继续看看还有没有其他的一些方法,再次感谢!


尽可能的对表访问一次,这样效率高,代码如下:
SQL> select * from crm;
YYYYMMAMOUNT
------- ----------
2015.01
2
2015.02
3
2015.03
6
2015.04
7
SQL>
SQL>
SQL> selectto_char(begin_dt, 'YYYY.MM') "起始月份",
2
to_char(end_dt, 'YYYY.MM') "截止月份",
3
sum(amount) over(partition by begin_dt order by ln) "金额"
4from
5(select level ln,
6
last_value(decode(level, 1, start_dt, null) ignore nulls) over(order by rownum) begin_dt,
7
start_dt end_dt,
8
amount
9 from
10(select to_date(yyyymm, 'yyyy.mm') start_dt,
11
add_months(to_date(yyyymm, 'yyyy.mm'),-1) end_dt,
12
amount
13 from crm)
14connect by prior start_dt = end_dt);
起始月份 截止月份 金额
-------- -------- ----------
2015.012015.01 2
2015.012015.02 5
2015.012015.03
11
2015.012015.04
18
2015.022015.02 3
2015.022015.03 9
2015.022015.04
16
2015.032015.03 6
2015.032015.04
13
2015.042015.04 7
10 rows selected
SQL>


回复

使用道具 举报

千问 | 2014-2-18 16:43:09 | 显示全部楼层
2楼就很好,但是为什么要加个union?
回复

使用道具 举报

千问 | 2014-2-18 16:43:09 | 显示全部楼层
newkid 发表于 2015-7-3 02:55
2楼就很好,但是为什么要加个union?

画蛇添足。


回复

使用道具 举报

千问 | 2014-2-18 16:43:09 | 显示全部楼层
递归+自连接都有了。。。。
回复

使用道具 举报

千问 | 2014-2-18 16:43:09 | 显示全部楼层
玩玩玩玩
with tmp as (
select '2015.01' dt, 2 value from dual union all
select '2015.02', 3 from dual union all
select '2015.03', 6 from dual union all
select '2015.04', 7 from dual
)
SELECT CONNECT_BY_ROOT dt,
dt,
dbms_aw.eval_number(ltrim(sys_connect_by_path(value,'+'),'+'))
FROM tmp
CONNECT BY to_date(dt,'yyyy.mm')=prior add_months(to_date(dt, 'yyyy.mm'), 1)
ORDER BY 1,2
回复

使用道具 举报

千问 | 2014-2-18 16:43:09 | 显示全部楼层
tag,这个对我帮助很大啊,了解许多函数
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行