Как сделать вычитание с этими значениями, используя псевдоним - PullRequest
0 голосов

У меня есть этот код:

SELECT
    Coalesce(Sum(Case When M.TIPO_MOVIMENTO = 'EE' Then M.VALOR End), 0) AS VALOR_EST_EMPENHO  ,
    Coalesce(Sum(Case When M.TIPO_MOVIMENTO = 'LI' Then M.VALOR End), 0) AS VALOR_LIQ_BRUTO,
    Coalesce(Sum(Case When M.TIPO_MOVIMENTO = 'EL' Then M.VALOR End), 0) AS VALOR_EST_LIQUIDACAO,
    Coalesce(Sum(Case When M.TIPO_MOVIMENTO In ('PG', 'RT') Then M.VALOR End), 0) AS VALOR_PAG_BRUTO,
    Coalesce(Sum(Case When M.TIPO_MOVIMENTO = 'EP' Then M.VALOR End), 0) AS VALOR_EST_PAGAMENTO,
    EMP_COD
FROM
    CTP_DESPESA_EMPENHADA_MOVIMENTACAO_VI M
GROUP BY
    M.EMP_COD

Я пытаюсь вычесть их и получить значение, но они используют псевдоним, поэтому, когда я делаю VALOR_EST_EMPENHO - VALOR_LIQ_BRUTO, я получаю следующее ошибка:

Сообщение 207, уровень 16, состояние 1, строка 23
Недействительное имя столбца 'VALOR_EST_EMPENHO'

Как я должен это сделать?

1 Ответ

0 голосов
/ 29 мая 2020

Пара вещей:

  1. Оператор CASE WHEN имеет путь ELSE. Лучше установить его на 0, чтобы избежать COALESCE.
  2. Как было предложено другими, вы можете повторить инструкции COALESCE (SUM ()) для получения желаемых результатов. Однако для удобства чтения я вижу, откуда вы.

    SELECT Sum(CALCULATED.VALOR_EST_EMPENHO) AS VALOR_EST_EMPENHO
     , Sum(CALCULATED.VALOR_LIQ_BRUTO) AS VALOR_LIQ_BRUTO
     , Sum(CALCULATED.VALOR_EST_LIQUIDACAO) AS VALOR_EST_LIQUIDACAO
     , Sum(CALCULATED.VALOR_PAG_BRUTO) AS VALOR_PAG_BRUTO
     , Sum(CALCULATED.VALOR_EST_PAGAMENTO) AS VALOR_EST_PAGAMENTO
     , Sum(CALCULATED.VALOR_EST_EMPENHO - CALCULATED.VALOR_LIQ_BRUTO) AS VALOR_X
     , M.EMP_COD
    FROM   CTP_DESPESA_EMPENHADA_MOVIMENTACAO_VI M
    CROSS APPLY(
      SELECT Case When M.TIPO_MOVIMENTO = 'EE' Then M.VALOR ELSE 0 End AS VALOR_EST_EMPENHO
           , Case When M.TIPO_MOVIMENTO = 'LI' Then M.VALOR ELSE 0 End AS VALOR_LIQ_BRUTO
           , Case When M.TIPO_MOVIMENTO = 'EL' Then M.VALOR ELSE 0 End AS VALOR_EST_LIQUIDACAO
           , Case When M.TIPO_MOVIMENTO In ('PG', 'RT') Then M.VALOR ELSE 0 End AS VALOR_PAG_BRUTO
           , Case When M.TIPO_MOVIMENTO = 'EP' Then M.VALOR ELSE 0 End AS VALOR_EST_PAGAMENTO
      ) CALCULATED
    GROUP BY
      M.EMP_COD
    

Встроенная таблица, полученная в результате оператора CROSS APPLY, вычисляется для каждой из строк. Во время выполнения запрос будет расширять столбцы, используемые из встроенной таблицы, так что эффективно это приведет к запросу с большим количеством операторов CASE WHEN.

Надеюсь, это поможет.

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