首页 > 解决方案 > 如何使用别名对这些值进行减法

问题描述

我有这个代码:

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”

我该怎么做?

标签: sqlsql-server

解决方案


几件事:

  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 语句。

我希望这有帮助。


推荐阅读