问一个月份和季度同时累计的问题,请赐教,谢谢!

[复制链接]
查看11 | 回复9 | 2015-7-24 13:55:37 | 显示全部楼层 |阅读模式
本帖最后由 520NET 于 2015-7-3 09:41 编辑
结构如下:
年月 金额
2015.01 2
2015.02 3
2015.03 6
2015.04 7
2015.05 7
2015.06 7
2015.07 7
分别按月统计结果如下:累计方式1为1月至某月,2为季度(1月至3月,4月至6月,7月至9,10月至12月)
一、统计1月份
年月
累计方式
金额
2015.01 1(1-1月)2
二、统计2月份
年月
累计方式
金额
2015.02 1(1-2月)5(2+3)
三、统计3月份
年月
累计方式
金额
2015.03 1(1-3月)11(2+3+6)
2015.03 2(1-3月)11(2+3+6)
四、统计4月份
年月
累计方式
金额
2015.04 1(1-4月)18(2+3+6+7)
五、统计5月份
年月
累计方式
金额
2015.05 1(1-5月)25(2+3+6+7+7)
六、统计6月份
年月
累计方式
金额
2015.06 1(1-6月)32(2+3+6+7+7+7)
2015.06 2(4-6月)21(7+7+7)
七、统计7月份
年月
累计方式
金额
2015.07 1(1-7月)39(2+3+6+7+7+7+7)



回复

使用道具 举报

千问 | 2015-7-24 13:55:37 | 显示全部楼层
sum(金额)over(order by 年月)
回复

使用道具 举报

千问 | 2015-7-24 13:55:37 | 显示全部楼层
把表示日期的字符转换为日期类型,然后用to_char函数取其季度值,用该季度值分组求和。
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,
1 flag
fromtmp t1,tmp t2 where t2.dt>=t1.dt
union
select min(t3.dt),
max(t3.dt),
sum(t3.value),
2 flag
from tmp t3
group by to_char(to_date(t3.dt,'yyyy.mm'),'q');
to newkid: 这次这个UNION不是多余的了。


回复

使用道具 举报

千问 | 2015-7-24 13:55:37 | 显示全部楼层
本帖最后由 520NET 于 2015-7-3 09:34 编辑
bfc99 发表于 2015-7-3 09:19
把表示日期的字符转换为日期类型,然后用to_char函数取其季度值,用该季度值分组求和。
with tmp as (
se ...
谢谢,这个结果我还得再进行筛选,再次感谢bfc99您每次及时的回复。
我想要的是分别按每个月统计,如对1月(或者2月、4月、5月、7月)进行统计是一个结果,而当对3月(或者6月)统计则是两个结果!
回复

使用道具 举报

千问 | 2015-7-24 13:55:37 | 显示全部楼层
520NET 发表于 2015-7-3 09:29
谢谢,这个结果我还得再进行筛选,再次感谢bfc99您每次及时的回复。
我想要的是分别按每个月统计,如对1 ...

把UNION上面的语句改一下即可:
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 tmp.dt,
sum(tmp.value) over (order by tmp.dt) sum_value,
1 flag
from tmp
union
select max(t3.dt),
sum(t3.value),
2 flag
from tmp t3
group by to_char(to_date(t3.dt,'yyyy.mm'),'q')
order by dt,flag;
回复

使用道具 举报

千问 | 2015-7-24 13:55:37 | 显示全部楼层
本帖最后由 520NET 于 2015-7-3 10:37 编辑
bfc99 发表于 2015-7-3 10:03
把UNION上面的语句改一下即可:
with tmp as (
select '2015.01' dt, 2 value from dual union all
谢谢bfc99,我想要的结果是这样的,如统计3月份,相当于如下SQL
select '2015.03' as dt, sum(tmp.value) sum_value, 1 flag
from tmp
where dt between '2015.01' and '2015.03'
union
select max(t3.dt), sum(t3.value), 2 flag
from tmp t3
where t3.dt between '2015.01' and '2015.03'
group by to_char(to_date(t3.dt, 'yyyy.mm'), 'q')
统计结果如下:
年月
累计方式
金额
2015.03 1(1-3月)11(2+3+6)
2015.03 2(1-3月)11(2+3+6)

统计4月份,相当于如下SQL
select '2015.04' as dt, sum(tmp.value) sum_value, 1 flag
from tmp
where dt between '2015.01' and '2015.04'
统计结果如下:
年月
累计方式
金额
2015.04 1(1-4月)18(2+3+6+7)
回复

使用道具 举报

千问 | 2015-7-24 13:55:37 | 显示全部楼层
520NET 发表于 2015-7-3 10:35
谢谢bfc99,我想要的结果是这样的,如统计3月份,相当于如下SQL
select '2015.03' as dt, sum(tmp.value ...

1、需要在PLSQL中进行判断,根据其是否是3、6、9、12月,执行不同的SQL。
2、输出的样式,最好在外层应用中控制。SQL在这方面比较弱。
回复

使用道具 举报

千问 | 2015-7-24 13:55:37 | 显示全部楼层
bfc99 发表于 2015-7-3 11:17
1、需要在PLSQL中进行判断,根据其是否是3、6、9、12月,执行不同的SQL。
2、输出的样式,最好在外层应用 ...

谢谢了,我自己写个SQL,如下:
WITH TMP AS
(SELECT '2015.01' DT, 2 AMNT
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
UNION ALL
SELECT '2015.05', 7
FROM DUAL
UNION ALL
SELECT '2015.06', 7
FROM DUAL
UNION ALL
SELECT '2015.07', 7
FROM DUAL)
SELECT DECODE(STAT_TYPE, '0', '1', '2'), SUM(STAT_AMNT)
FROM (SELECT NVL(TO_CHAR(TO_DATE(T.DT, 'YYYY.MM'), 'Q'), 0) AS STAT_TYPE,

SUM(T.AMNT) AS STAT_AMNT

FROM TMP T
WHERE T.DT BETWEEN SUBSTR('2015.07', 1, 4) || '.01' AND '2015.07'
GROUP BY ROLLUP(TO_CHAR(TO_DATE(T.DT, 'YYYY.MM'), 'Q')))
WHERE MOD(STAT_TYPE * 3, SUBSTR('2015.07', 6, 2)) = 0
GROUP BY DECODE(STAT_TYPE, '0', '1', '2')

回复

使用道具 举报

千问 | 2015-7-24 13:55:37 | 显示全部楼层
bfc99 发表于 2015-7-3 09:19
把表示日期的字符转换为日期类型,然后用to_char函数取其季度值,用该季度值分组求和。
with tmp as (
se ...

觉得应该是union all
回复

使用道具 举报

千问 | 2015-7-24 13:55:37 | 显示全部楼层
你这是用sql给你出报表啊,大湿。。。
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行