Динамическое имя столбца в обновлении из выбора - PullRequest
0 голосов
/ 01 апреля 2019

Я хочу получить столбцы динамически из оператора UPDATE FROM SELECT, но столкнулся с ошибкой

Я хочу обновить {e.region}+'_CAP' в таблице t_ipd.Здесь e.region является динамическим, который происходит из оператора select.Однако e.region+'_CAP' = дает ошибку.Пожалуйста, сообщите

Пожалуйста, найдите код ниже

update t_ipd set e.region+'_CAP' = x.RGN_USD_CAP

from 
(

  (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_ipd i inner join t_ct_request r on i.T_Code = r.REQUEST_ID 
       inner join  t_ct_request_estimation re
       on r.REQUEST_ID = re.REQUEST_ID inner join t_ct_estimation e
       on re.REQUEST_EST_ID = e.REQUEST_EST_ID 

       where  e.region != 'EMEA'
       --and e.country!='BELGIUM' 
       and    re.REQUEST_ID in 
       (
       SELECT
              DISTINCT TOP 2147483647  REQUEST_ID
       FROM
              T_CT_REQUEST
       where

              IS_DELETED = 'N'
              AND NO_OF_CHILD_REQ != -1   
       )GROUP BY e.REGION,r.request_id)
       union
       (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_ipd i inner join t_ct_request r on i.T_Code = r.REQUEST_ID 
       inner join  t_ct_request_estimation re
       on r.REQUEST_ID = re.REQUEST_ID inner join t_ct_estimation e
       on re.REQUEST_EST_ID = e.REQUEST_EST_ID 

       where  e.region = 'EMEA' 
       and    re.REQUEST_ID in 
       (
       SELECT
              DISTINCT TOP 2147483647  REQUEST_ID
       FROM
              T_CT_REQUEST
       where

              IS_DELETED = 'N'
              AND NO_OF_CHILD_REQ != -1   
       )GROUP BY e.REGION,r.request_id)
)x
where t_ipd.t_code = x.req_id

1 Ответ

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

Я бы использовал для этого опорный пункт ...

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), поэтому я удалил ненужный код и оптимизировал запрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...