Существует ли запрос на обновление SQL для обновления одного и того же значения для нескольких записей с одним и тем же идентификатором пользователя? - PullRequest
1 голос
/ 18 апреля 2019

У меня есть столбец, который используется только для расчетов.Он отображает либо 0, либо положительное число, которое представляет время отпуска.В нашей Таблице времени это введено как отрицательное число, и я преобразовываю это в положительное число для вычислений.Мне нужно, чтобы это положительное значение входило в столбец NonWorkHrs для каждой записи сотрудника.Это должно быть одинаковое значение для всех записей в идентификаторе пользователя.

Я пробовал использовать операторы case и выбирать max в подзапросе

update DME
set NonWorkHrs = 
(
 select max(VacationHours)
 from DME b
 where useruid = b.useruid
 and useruid in (1,2,3)
 and NonWorkHrsHolder > 0
)
where useruid in (1,2,3)

Я также пробовал оператор case

update DME
set NonWorkHrs =
(case 
  when (VacationHours > 0)
  then (VacationHours)
 --no else statement is need. All rows should have the same value
 end
 ) 
where useruid in (1,2,3)

Я конвертирую отрицательные значения TimeEntered в положительные значения в столбце VacationHours.Столбец NonWorkHrs используется в вычислениях для определения фактических рабочих часов.

Ожидаемый результат

Useruid UserFullName    NonWorkHrs  VacationHours   TimeEntered
1       Jane Doe         8             8             -8
1       Jane Doe         8             0              10
1       Jane Doe         8             0              12
2       John Doe         18            18            -18
2       John Doe         18            0              23
3       Bob Builder      16            16            -16
3       Bob Builder      16            0              40

Фактический результат

Useruid UserFullName    NonWorkHrs  VacationHours   TimeEntered
1       Jane Doe          18           8             -8
1       Jane Doe          18           0              10
1       Jane Doe          18           0              12
2       John Doe          18           18            -18
2       John Doe          18           0              23
3       Bob Builder       18           16            -16
3       Bob Builder       18           0              40

Ответы [ 3 ]

0 голосов
/ 18 апреля 2019

Использование CTE :

  ;WITH vacationsPerUser as (
      SELECT userId, max(VacationHours) as maxVacationHours
      FROM DME 
      WHERE useruid in (1,2,3)
        and NonWorkHrsHolder > 0
      GROUP BY userId
     )
  Update b
    SET b.NonWorkHrs = ISNULL(vacationsPerUser.maxVacationHours, 0)
    FROM DME b 
    LEFT JOIN vacationsPerUser
         ON vacationsPerUser.UserId = b.UserId
    WHERE b.useruid in (1,2,3);
0 голосов
/ 18 апреля 2019

Или это (дает такой же, как ваш ожидаемый результат)

UPDATE a
    SET NonWorkHrs = ABS(sub.minNegativeTime)
FROM DME a
INNER JOIN (
    SELECT useruid, MIN(TimeEntered) minNegativeTime
    FROM DME b
    WHERE b.TimeEntered < 0
    GROUP BY Useruid
) sub ON sub.Useruid = a.Useruid
0 голосов
/ 18 апреля 2019

Этот запрос должен работать, попробуйте.

DECLARE @DME TABLE
(
Useruid int,
UserFullName varchar(200),
NonWorkHrs  int,
VacationHours   int,
TimeEntered int
)

INSERT INTO @DME
VALUES
(1,'Jane Doe',18,8,-8),
(1,'Jane Doe',18,0,10),
(1,'Jane Doe',18,0,12),
(2,'John Doe',18,18,-18),
(2,'John Doe',18,0,23),
(3,'Bob Builder',18,16,-16),
(3,'Bob Builder',18,0,40)

SELECT d.* FROM @DME d

    UPDATE @DME
        SET NonWorkHrs = T2.VacationHours
    FROM @DME T1
    INNER JOIN (SELECT Max(VacationHours) AS VacationHours, Useruid FROM @DME GROUP BY Useruid) AS T2 
    ON T2.Useruid = T1.Useruid


SELECT d.* FROM @DME d
...