2012-11-06 284 views
1

我有下表,为了便于阅读,我在每个案例编号的每位经理后分解。当数据丢失时插入表格

最后一列是倒数第二列的累计总和。

月的价值理想情况下应该从1-3(如你看到芝加哥的两个案例)。

但是从表中您可以看到在某些情况下某些条目丢失(标记为< -----)。

CITY  CASE CASE_NUMBER MANAGER MONTH MONTHLY_TOTAL FISCAL_TOTAL 
--------------------------------------------------------------------------- 
chicago case_1 1    John  1   2    2  
chicago case_1 1    John  2   3    5 
chicago case_1 1    John  3   5    10 

chicago case_1 1    Jeff  1   4    4  
chicago case_1 1    Jeff  2   2    6 
chicago case_1 1    Jeff  3   3    9 

chicago case_2 2    John  1   3    3  
chicago case_2 2    John  2   2    5 
chicago case_2 2    John  3   4    9 

chicago case_2 2    Jeff  1   2    2  
chicago case_2 2    Jeff  2   7    9 <---- 

newyork case_1 1    Lee  1   3    3  
newyork case_1 1    Lee  2   4    7 <---- 

newyork case_1 1    Sue  1   2    2  
newyork case_1 1    Sue  2   3    5  
newyork case_1 1    Sue  3   2    7 

newyork case_1 2    Lee  1   2    2  
newyork case_1 2    Lee  2   4    6 
newyork case_1 2    Lee  3   4    10 

newyork case_1 2    Sue  1   3    3  
newyork case_1 2    Sue  2   2    5 <---- 

我想要的是先找出那些缺少的行并插入值。

对于那些没有的部分monthly_total前一行中= 0

fiscal_total =值。

E.g.对于第一个缺失的行应该是:

CITY  CASE CASE_NUMBER MANAGER MONTH MONTHLY_TOTAL FISCAL_TOTAL 
--------------------------------------------------------------------------- 
chicago case_2 2    Jeff  3   0    9 

回答

0

也许这可能会给一些想法。我在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) 
+0

Glenn,感谢您的精彩解决方案,我试图使用PL/SQL游标和集合来逐行处理,然后弄清楚如何对每个'case'组中的max进行排序。然后,如果max不是'3',我想在表格中插入集合的值(从光标中提取)......但是没有成功脱离课程。你认为这是可能的吗(如果是的话请引导)或者它是完全错误的! – user1804548

0

假设在每个情况下,每个管理者应该有三个条目,你可以尝试这样的:

SELECT City, Case, Manager, COUNT(Manager) AS CASE_COUNT 
FROM table(put actual table name) 
GROUP BY City, Case, Manager 

的CASE_COUNT栏显示你会发现表格中的条目对于经理人员处理的每个案例而言都是如此,如果该数字小于3,则知道缺少一个条目(当然这假设有s他们每个人都没有3分)。