也许这可能会给一些想法。我在Postgresql上运行它,但只需要Oracle的轻微更改。然后一些清理。我们的想法是这样的:
- 生成月份列表
- 跨产品与键组的几个月
- 再加入结果返回到原来的表中的值
- 使用的解析函数对于运行总计
设置:
create table theTable(city varchar(64), theCase varchar(64), case_number int, manager varchar(64), month int, monthly_total int, fiscal_total int);
insert into theTable values('chicago', 'case_1', 1, 'John', 1, 2, 2);
insert into theTable values('chicago', 'case_1', 1, 'John', 2, 3, 5);
insert into theTable values('chicago', 'case_1', 1, 'John', 3, 5, 10);
insert into theTable values('chicago', 'case_1', 1, 'Jeff', 1, 4, 4);
insert into theTable values('chicago', 'case_1', 1, 'Jeff', 2, 2, 6);
insert into theTable values('chicago', 'case_1', 1, 'Jeff', 3, 3, 9);
insert into theTable values('chicago', 'case_2', 2, 'John', 1, 3, 3);
insert into theTable values('chicago', 'case_2', 2, 'John', 2, 2, 5);
insert into theTable values('chicago', 'case_2', 2, 'John', 3, 4, 9);
insert into theTable values('chicago', 'case_2', 2, 'Jeff', 1, 2, 2);
insert into theTable values('chicago', 'case_2', 2, 'Jeff', 2, 7, 9);
insert into theTable values('newyork', 'case_1', 1, 'Lee', 1, 3, 3);
insert into theTable values('newyork', 'case_1', 1, 'Lee', 2, 4, 7);
insert into theTable values('newyork', 'case_1', 1, 'Sue', 1, 2, 2);
insert into theTable values('newyork', 'case_1', 1, 'Sue', 2, 3, 5);
insert into theTable values('newyork', 'case_1', 1, 'Sue', 3, 2, 7);
insert into theTable values('newyork', 'case_1', 2, 'Lee', 1, 2, 2);
insert into theTable values('newyork', 'case_1', 2, 'Lee', 2, 4, 6);
insert into theTable values('newyork', 'case_1', 2, 'Lee', 3, 4, 10);
insert into theTable values('newyork', 'case_1', 2, 'Sue', 1, 3, 3);
insert into theTable values('newyork', 'case_1', 2, 'Sue', 2, 2, 5);
查询:
-- the 3 months
with three as (select 1 AS month union select 2 union select 3)
-- select rownum from all_tables where rownum < 4 -- Oracle world
-- the key
,city as (select distinct city, theCase, case_number, manager from theTable)
select x.city, x.theCase, x.case_number, x.manager, x.month, COALESCE(y.monthly_total,0)
,SUM(COALESCE(y.monthly_total,0)) OVER (PARTITION BY x.city, x.theCase, x.case_number, x.manager
ORDER BY x.month) AS fiscal_total2
,y.fiscal_total
-- cross product the key to form record for each month
from (select c.city, c.theCase, c.case_number, c.manager, t.month
from city c
,three t
) x
-- join "desired" set back to "have" set
left outer join theTable y ON ( x.city = y.city
and x.theCase = y.theCase
and x.case_number = y.case_number
and x.manager = y.manager
and x.month = COALESCE(y.month, x.month)
)
order by x.city, x.theCase, x.case_number, x.manager, x.month;
结果:
city | thecase | case_number | manager | month | coalesce | fiscal_total2 |fiscal_total
---------+---------+-------------+---------+-------+----------+---------------+--------------
chicago | case_1 | 1 | Jeff | 1 | 4 | 4 | 4
chicago | case_1 | 1 | Jeff | 2 | 2 | 6 | 6
chicago | case_1 | 1 | Jeff | 3 | 3 | 9 | 9
chicago | case_1 | 1 | John | 1 | 2 | 2 | 2
chicago | case_1 | 1 | John | 2 | 3 | 5 | 5
chicago | case_1 | 1 | John | 3 | 5 | 10 | 10
chicago | case_2 | 2 | Jeff | 1 | 2 | 2 | 2
chicago | case_2 | 2 | Jeff | 2 | 7 | 9 | 9
chicago | case_2 | 2 | Jeff | 3 | 0 | 9 |
chicago | case_2 | 2 | John | 1 | 3 | 3 | 3
chicago | case_2 | 2 | John | 2 | 2 | 5 | 5
chicago | case_2 | 2 | John | 3 | 4 | 9 | 9
newyork | case_1 | 1 | Lee | 1 | 3 | 3 | 3
newyork | case_1 | 1 | Lee | 2 | 4 | 7 | 7
newyork | case_1 | 1 | Lee | 3 | 0 | 7 |
newyork | case_1 | 1 | Sue | 1 | 2 | 2 | 2
newyork | case_1 | 1 | Sue | 2 | 3 | 5 | 5
newyork | case_1 | 1 | Sue | 3 | 2 | 7 | 7
newyork | case_1 | 2 | Lee | 1 | 2 | 2 | 2
newyork | case_1 | 2 | Lee | 2 | 4 | 6 | 6
newyork | case_1 | 2 | Lee | 3 | 4 | 10 | 10
newyork | case_1 | 2 | Sue | 1 | 3 | 3 | 3
newyork | case_1 | 2 | Sue | 2 | 2 | 5 | 5
newyork | case_1 | 2 | Sue | 3 | 0 | 5 |
(24 rows)
Glenn,感谢您的精彩解决方案,我试图使用PL/SQL游标和集合来逐行处理,然后弄清楚如何对每个'case'组中的max进行排序。然后,如果max不是'3',我想在表格中插入集合的值(从光标中提取)......但是没有成功脱离课程。你认为这是可能的吗(如果是的话请引导)或者它是完全错误的! – user1804548