sql—如何使用alias对这些值进行减法

qgelzfjb  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(311)

我有这个密码:

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

我想做的是减去它们得到值,但是它们使用的是alias,所以当我这样做的时候 VALOR_EST_EMPENHO - VALOR_LIQ_BRUTO 它使我产生以下错误:
消息207,16级,状态1,第23行
列名“valor_est_empenho”无效
我该怎么做?

dfddblmv

dfddblmv1#

两件事:
语句有else路径的情况。最好将其设置为0以避免合并。
按照其他人的建议,可以重复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语句。
我希望这有帮助。

相关问题