Примечание: поскольку одновременно может быть обновлено больше записей Таблицы1, имеющих один и тот же ключ, необходимо суммировать различия, помещая только суммарный вес в положительные и отрицательные итоговые поля. Попытка сделать это без суммирования потерпит неудачу, потому что будет записана только последняя строка с тем же ключом, а остальные отброшены.
alter trigger theTrigger on Table1
after update, insert
as
set NoCount ON
if update(Value)
begin
-- Add missing records to summary table
insert into table2 (Key, positive_sum, negative_sum)
select distinct Key, 0, 0
from Inserted
where not exists (select null from table2 t2 where t2.Key = Inserted.Key)
-- Update summary
update table2
set Positive_sum = isnull(positive_sum, 0) + isnull (diff.Positives, 0),
Negative_sum = isnull(Negative_sum, 0) + isnull (diff.Negatives, 0)
from table2
-- One can have only one record per key because otherwise sums would not be correct.
inner join (select Inserted.Key,
sum (case when Inserted.Value > isnull(Deleted.Value, 0) then Inserted.Value - isnull(Deleted.Value, 0) end) Positives,
sum (case when Inserted.Value < isnull(Deleted.Value, 0) then isnull(Deleted.Value, 0) - Inserted.Value end) Negatives,
from Inserted
left join Deleted on Inserted.ID = Deleted.ID
group by Inserted.Key
) diff
on table2.Key = diff.Key
end