2015-02-17 57 views
1

我需要根据特定条件增加列值。在Oracle中增加列值

我有2个表 -

表A的ID,姓名,日期,等等

Id Name Date 
1 ABC 3/1/2014 
2 ABC 4/1/2014 
3 ABC 5/1/2014 
4 DEF 4/1/2014 
5 DEF 5/1/2014 
6 HIJ 1/1/2014 
7 HIJ 2/1/2014 
8 HIJ 3/1/2014 
9 HIJ 4/1/2014 
10 HIJ 5/1/2014 

表B有名称(外键),日期(将同表A) ,柜台等。

Name Date Counter(the value that I need is in this column, it will be zero by default) 
ABC 3/1/2014 0 
ABC 4/1/2014 1 
ABC 5/1/2014 2 
DEF 4/1/2014 0 
DEF 5/1/2014 1 
HIJ 1/1/2014 0 
HIJ 2/1/2014 1 
HIJ 3/1/2014 2 
HIJ 4/1/2014 3 
HIJ 5/1/2014 4 

我需要增加计数器,如上表所示。因此,对于每个名称计数器应该重置,并从0开始,每个名称的日期将会不同,所以我需要考虑这一点(意思是我不能假设所有名称都为1/31/2014为0)将结束在说5/1/2014。所以我需要更新计数器,直到日期已达到5/1/2014。

什么是最好的方法来实现这一目标?我想写一个过程,但不知道我怎么可以更新的游标不同的名字在柜台上。我愿意接受任何建议。谢谢。

编辑:::更新的代码

Update Table B, set counter = 0; 

declare 

cursor rec is 

select a.name, a.postingdate, b.counter 
from table A a 
inner join table B b 
on a.name = b.name 
order by a.name, a.date; 

begin 

    open rec; 
    LOOP 
     fetch rec into v_name, v_date, v_counter; 
     exit........... 

**<How can I reset my counter here for different names>** 
     if date < to_date ('01-may-2014', 'dd-mon-yy') then v_counter := v_counter +1; 
     end if; 

     update table b set counter = v_counter where current of rec; 
    END LOOP; 
    commit; 
END; 
+1

显示一些代码。即使它是越野车或丑陋或其他。你必须展示一些代码,否则你似乎在寻求别人去做你的工作。 – alkis 2015-02-17 20:15:45

+0

够公平的。我已经更新了上面的代码。 – user115391 2015-02-17 20:36:02

回答

2

请复制/粘贴看到的结果:

SELECT deptno, ename (your_counter-1) new_counter FROM 
(SELECT deptno, ename 
     , ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY deptno, ename) your_counter 
FROM scott.emp 
); 

10 CLARK 0 
10 KING 1 
10 MILLER 2 
20 ADAMS 0 
20 FORD 1 
20 JONES 2 
20 SCOTT 3 
.... 

在你的情况,你的名字分区。

+0

谢谢,我用这个来更新我的查询,我放弃了我的程序。 – user115391 2015-02-17 21:37:39

3

下面的查询应该做你想要什么:

​​

SQLFiddle here

分享和享受。

+0

感谢鲍勃。我用Art的查询,得到了我想要的。谢谢你的时间。 – user115391 2015-02-17 21:38:50