如何在其他列的基础上填充一列?

时间:2018-06-22 03:20:22

标签: sql oracle plsql

我有一张这样的桌子:

|-------|----------|------------|-----------|------------|
| M_ID  | YEAR     | NEW_M_ID   |STATUS_CODE|GROUP_NUMBER|
|-------|----------|------------|-----------|------------|
|111    |2010      |111-2010    |    0      |            |
|111    |2011      |111-2011    |    0      |            |
|111    |2013      |111-2013    |    1      |            |
|111    |2014      |123-2014    |    0      |            |
|123    |2009      |123-2009    |    0      |            |
|123    |2010      |123-2010    |    3      |            |
|123    |2014      |123-2014    |    0      |            |
|-------------------------------------------|------------|             

我想在其他列的基础上填充group_number列中的值。 所需的输出应如下所示:

|-------|----------|------------|-----------|------------|
| M_ID  | YEAR     | NEW_M_ID   |STATUS_CODE|GROUP_NUMBER|
|-------|----------|------------|-----------|------------|
|111    |2010      |111-2010    |    0      |      1     |
|111    |2011      |111-2011    |    0      |      1     |
|111    |2013      |111-2013    |    1      |      1     |
|111    |2014      |123-2014    |    0      |      2     |
|111    |2015      |123-2015    |    0      |      2     |  
|123    |2010      |123-2010    |    3      |      1     |
|123    |2014      |123-2014    |    0      |      2     |
|-------------------------------------------|------------|

我使用的代码是这样的:

declare
    group_num number:=1;
    old_acct CHAR(15):=' ' ;
    short_acct_number CHAR (10):= ' ';
begin
    for i in (
        select ACCT_NUMBER, status from xxx.transaction 
        order by acct_number
    )
    loop
        short_acct_number := SUBSTR(i.ACCT_NUMBER, 1, LENGTH(i.ACCT_NUMBER)-5);

        if short_acct_number <> old_acct then
            group_num := 1;
        end if;

        if i.status <> 0 then
            update xxx.transaction set group_number = group_num
            where  acct_number <= i.acct_number
            and    group_number is null;

            group_num := group_num + 1;
        end if;

        old_acct := short_acct_number;
    end loop;
end;

我的代码存在问题,因为它没有在第6行中将group_number填充为1,这是错误的。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

在查询输出下方发送。

select ACCT_NUMBER, status from xxx.transaction 
order by acct_number

答案 1 :(得分:0)

现在这就是代码计算的工作方式 声明:

group_num = 1 old_acct =‘

循环

迭代1和2状态代码= 0不会进入循环

设置old_acct = short_acct_number

对于迭代3,状态码= 1进入循环

设置group_num = group_num + 1 = 1 + 1 = 2

对于迭代4和5,状态码= 0不会进入循环

对于迭代6,输入状态代码并更新group_number = group_num

如上所述,在迭代3中将其设置为值2。

这就是为什么在第六列中没有获得Group_Number为1的原因。 如果确切的答案是1,则需要修正group_num的计算方法,但此时,您没有给我们提供设置group_number的逻辑。 也在光标上

Select Acct_Number , status from xxx.transaction 

如果您的xxx.transaction表仅包含上面提到的列,则我们无法理解其逻辑,请也分享有关此信息的更多信息。