2011-10-21 267 views
0

我有一个名为RowSettingStatus这样AA表:SQL Server存储过程

ReqNum WorkID RevNum RowStatus 
1111  10  1   NULL 
1111  10  5   NULL 
1111  11  2   NULL 
1111  11  10  NULL 
1111  106  3   NULL 
1111  10  11  NULL 
1111  10  12  NULL 
1111  10  13  NULL 
1111  10  14  NULL 
1111  10  15  NULL 
1111  10  16  NULL 
2222  51  1   NULL 
2222  51  6   NULL 
2222  10  7   NULL 
2222  11  2   NULL 

我的要求是特定ReqNum,当WorkID = 10,RowStatus将由“F”更新时RevNum最小,当RevNum最大时,RowStatus将由'L'更新。对于其他人,它将是'I'。

例如,当我使用参数ReqNum = 1111运行存储过程时,它将一次更新如下。

ReqNum WorkID RevNum RowStatus 

1111  10  1   F 
1111  10  5   I 
1111  11  2   F 
1111  11  10  I 
1111  106  3   F 
1111  10  11  I 
1111  10  12  I 
1111  10  13  I 
1111  10  14  I 
1111  10  15  I 
1111  10  16  L 
2222  51  1   NULL 
2222  51  6   NULL 
2222  10  7   NULL 
2222  11  2   NULL 

注意:表格中有许多行。

任何人都可以写程序?

+3

也许 - 你去过吗?这是功课吗? –

+0

想想案件陈述先生 – rahularyansharma

+0

更新金额设置金额= ID = 1时的情况15 then else 20结束 – rahularyansharma

回答

0

我已经有东西关闭到您的显示所需的输出,但如注释中所示,要求和期望的输出似乎不匹配。我想,我已经试着去符合你的书面要求。


样品表/数据:

create table #RowSettingStatus (ReqNum int,WorkId int,RevNum int,RowStatus char(1)) 
insert into #RowSettingStatus (ReqNum, WorkID, RevNum, RowStatus) 
select 1111,  10,  1,   NULL union all 
select 1111,  10,  5,   NULL union all 
select 1111,  11,  2,   NULL union all 
select 1111,  11,  10,  NULL union all 
select 1111,  106,  3,   NULL union all 
select 1111,  10,  11,  NULL union all 
select 1111,  10,  12,  NULL union all 
select 1111,  10,  13,  NULL union all 
select 1111,  10,  14,  NULL union all 
select 1111,  10,  15,  NULL union all 
select 1111,  10,  16,  NULL union all 
select 2222,  51,  1,   NULL union all 
select 2222,  51,  6,   NULL union all 
select 2222,  10,  7,   NULL union all 
select 2222,  11,  2,   NULL 

实际更新:

declare @ReqNum int 
set @ReqNum = 1111 
;with Numbered as (
    select *, 
     ROW_NUMBER() OVER (PARTITION BY ReqNum,WorkID ORDER by RevNum) as rn1, 
     ROW_NUMBER() OVER (PARTITION BY ReqNum,WorkID ORDER by RevNum desc) as rn2 
    from 
     #RowSettingStatus 
) 
update Numbered set 
    RowStatus = CASE 
        WHEN rn1 = 1 THEN 'F' 
        WHEN rn2 = 1 THEN 'L' 
        ELSE 'I' 
       END 
where ReqNum = @ReqNum 

结果:

select * from #RowSettingStatus 

ReqNum WorkId RevNum RowStatus 
1111 10  1  F 
1111 10  5  I 
1111 11  2  F 
1111 11  10  L --<-- This line doesn't match your output, but is the MAX(RevNum) for WorkId 11... 
1111 106 3  F 
1111 10  11  I 
1111 10  12  I 
1111 10  13  I 
1111 10  14  I 
1111 10  15  I 
1111 10  16  L 
2222 51  1  NULL 
2222 51  6  NULL 
2222 10  7  NULL 
2222 11  2  NULL 

我使用ROW_NUMBER(),让我找到了“第一”和各WorkId,其中排列顺序意味着这些,反过来,MIN()MAX()RevNum值范围内的“最后”行。