Я бы использовал для этого опорный пункт ...
UPDATE t
SET A_CAP = A, B_CAP = B, C.CAP = C, D.CAP = D
FROM t_ipd t
JOIN (
SELECT
e.region,
r.REQUEST_ID AS req_id,
SUM(e.TOTAL_CAPITAL*e.CONVERSION_RATE) as RGN_USD_CAP,
SUM(e.AMORT_TOTAL_EXP*e.CONVERSION_RATE) as RGN_USD_EXP
FROM t_ct_request r
JOIN t_ct_request_estimation re ON r.REQUEST_ID = re.REQUEST_ID
JOIN t_ct_estimation e ON re.REQUEST_EST_ID = e.REQUEST_EST_ID
WHERE
r.REQUEST_ID AND r.IS_DELETED = 'N' AND r.NO_OF_CHILD_REQ != -1
GROUP BY e.REGION,r.request_id
) x
PIVOT (
MAX(RGN_USD_CAP) FOR Region IN ([A], [B], [C], [D])
) pvt ON t.t_code = pvt.req_id
Если у вас большой список регионов, вы можете использовать динамический SQL
DECLARE @SQL NVARCHAR(MAX)
SELECT abc = STUFF((
SELECT DISTINCT ', ' + QUOTENAME(region + '_CAP') + ' = ' + QUOTENAME(region)
FROM t_ct_request
FOR XML PATH('')
), 1, 1, '')
SET @SQL = N'
UPDATE t
SET ' + STUFF((
SELECT DISTINCT ', ' + QUOTENAME(region + '_CAP') + ' = ' + QUOTENAME(region)
FROM t_ct_request
FOR XML PATH('')
), 1, 1, '') + '
FROM t_ipd t
JOIN (
SELECT
e.region,
r.REQUEST_ID AS req_id,
SUM(e.TOTAL_CAPITAL*e.CONVERSION_RATE) as RGN_USD_CAP,
SUM(e.AMORT_TOTAL_EXP*e.CONVERSION_RATE) as RGN_USD_EXP
FROM t_ct_request r
JOIN t_ct_request_estimation re ON r.REQUEST_ID = re.REQUEST_ID
JOIN t_ct_estimation e ON re.REQUEST_EST_ID = e.REQUEST_EST_ID
WHERE
r.REQUEST_ID AND r.IS_DELETED = 'N' AND r.NO_OF_CHILD_REQ != -1
GROUP BY e.REGION,r.request_id
) x
PIVOT (
MAX(RGN_USD_CAP) FOR Region IN (' + STUFF((
SELECT DISTINCT ', ' + QUOTENAME(ProductID)
FROM MyTable
FOR XML PATH('')
), 1, 1, '') + ')
) pvt ON t.t_code = pvt.req_id'
EXEC (@SQL)
Примечание Я не нашел никакой разницы в ваших запросах UNION, а выражения IN избыточны и слишком тяжелы (если вы все еще считаете, что они вам нужны, проверьте мой предыдущий выпуск и используйте вместо него EXISTS), поэтому я удалил ненужный код и оптимизировал запрос