Хранимая процедура SQL Server

#sql-server #stored-procedures

#sql-сервер #Хранимые процедуры

Вопрос:

У меня есть таблица с именем RowSettingStatus, подобная этой:

 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
  

Мое требование касается определенного запроса, когда WorkID = 10, RowStatus будет обновляться на ‘F’, когда число оборотов будет минимальным, а 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
  

Примечание: В таблице много строк.

Пожалуйста, кто-нибудь может написать процедуру?

Комментарии:

1. Вероятно, — вы попробовали? Это домашнее задание?

2. подумайте о статусе обращения, сэр

3. суммы обновления задают количество = случай, когда ID = 1, затем 15, еще 20 заканчиваются

4.Почему 1111,11,2 F и / или почему 1111,11,10 I вместо L ? Подразумеваемое вами описание имело значение только для учета и учета, поэтому я не могу соответствовать вашему описанию и ожидаемому результату. WorkID 10 F L

5. Предположим, что для WorkID = 10 RowStatus будет равен F с минимальным значением (RevNum), а RowStatus будет равен L с максимальным значением (RevNum). Другой RowStatus будет обновлен как I для этого конкретного WorkID

Ответ №1:

У меня есть что-то близкое к показанному вами желаемому результату, но, как указано в комментариях, требования и желаемый результат, похоже, не совпадают. Я думаю, я пытался соответствовать вашим письменным требованиям.


Пример таблицы / данных:

 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() and MAX() RevNum .