2011-10-21 70 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值範圍內的「最後」行。