Как обновить таблицу на основе значений в других столбцах - PullRequest
0 голосов
/ 26 декабря 2018

Вот пример ниже, я хочу обновить столбец AvailableAmt на основе суммы, введенной в пользовательском интерфейсе.

enter image description here

Требование

Обновление значения из последней строки до первой строки

  1. Если введено 500 в пользовательском интерфейсе, то таблица будет выглядеть как enter image description here

  2. Если введено 1000 в пользовательском интерфейсе, то таблицабудет как enter image description here

Спасибо за вашу помощь заранее!

1 Ответ

0 голосов
/ 26 декабря 2018

Не могу где-нибудь протестировать его на Sybase.
Но теоретически что-то подобное может сработать:

DECLARE @Group VARCHAR(8) = 'a';
DECLARE @Amount INT = 1100;

UPDATE t
SET t.AvailableAmt = 
  CASE 
  WHEN q.PrevRemain > 0 AND t.AvailableAmt <= q.PrevRemain THEN 0
  WHEN q.PrevRemain > 0 THEN t.AvailableAmt - q.PrevRemain
  ELSE t.AvailableAmt
  END
FROM YourTable t
JOIN
(
    select [Group], [Row], 
     @Amount-(SUM(AvailableAmt) OVER (PARTITION BY [Group] ORDER BY AvailableAmt, [Row] desc) - AvailableAmt) as PrevRemain
    from YourTable
    where AvailableAmt > 0
      and [Group] = @Group
) AS q
ON (q.[Group] = t.[Group] and q.[Row] = t.[Row]);

Для варианта Sybase, который не поддерживает оконную функцию SUM, что-токак это может работать.

DECLARE @Group VARCHAR(8) = 'a';
DECLARE @Amount INT = 1200;

UPDATE t
SET t.AvailableAmt = 
  CASE 
  WHEN q.PrevRemain > 0 AND t.AvailableAmt <= q.PrevRemain THEN 0
  WHEN q.PrevRemain > 0 THEN t.AvailableAmt - q.PrevRemain
  ELSE t.AvailableAmt
  END
FROM YourTable t
JOIN
(
    select t1.[Group], t1.[Row], 
     @Amount - (SUM(t2.AvailableAmt)-t1.AvailableAmt) as PrevRemain
    from YourTable t1
    left join YourTable t2 on (t2.[Group] = t1.[Group]  and t2.AvailableAmt <= t1.AvailableAmt and t2.[Row] >= t1.[Row])
    where t1.AvailableAmt > 0
      and t1.[Group] = @Group
    group by t1.[Group], t1.[Row], t1.AvailableAmt
) AS q 
ON (q.[Group] = t.[Group] and q.[Row] = t.[Row]);
...