Если вы просто хотите выбрать суммы, вы можете использовать оконные функции:
select id, item, max(case when item = 'sh' then amount end) over (partition by id) as Amount
from t ;
Если вы хотите изменить данные, тогда вы используете update
:
with toupdate as (
select t.*, max(case when item = 'sh' then amount end) over (partition by id) as newAmount
from t
)
update toupdate
set amount = newAmount
where amount is null;
Я не вижу преимуществ в том, чтобы делать и то, и другое.Если вам нужно обновление и вы хотите, чтобы результаты были возвращены, выполните два запроса.