none
Condição do Case RRS feed

  • Pergunta

  • Prezados boa tarde!

    tenho seguinte resultado da SQL 

    Bloco        Unidade    Status       Resultado Case

    TOR 1 000502 VENDIDO Quitada       410880.00 Quitada
    TOR 1 000503          VENDIDO Efetivada     308906.89 Efetivada
    TOR 1 000504  VENDIDO Nao Sair   317352.41  Distratada
    TOR 1 000504         VENDIDO Efetivada    327300.00 Efetivada                                                         TOR 1 000506  VENDIDO Nao Sair    317352.41  Distratada
    TOR 1 000506 VENDIDO Efetivada     288442.94 Efetivada

    Os valores em Negrito em usei o case abaixo:

    case when  X1.DSC_SIT_VENDA = 'Distratada' and XSIT.DSC_SIT_SUB_UNID = 'VENDIDO' then 'Nao Sair' 
    else X1.DSC_SIT_VENDA end 'St',

    onde situacao venda Distratada e com status da unidade vendido nao pode sair, consegui fazer no case porem eu preciso colocar isso no Where da SQL abaixo:

    SELECT
    --XU.COD_PESS_EMPR  ,
    XU.NUM_UNID       AS 'BLOCO/QUADRA',
     (XU.NUM_SUB_UNID)   AS 'APTO/LOTE',
    XSIT.DSC_SIT_SUB_UNID,
    --XP.PRECOSUBUNID,
    --XP.STATUSVINCULO,
    case when  X1.DSC_SIT_VENDA = 'Distratada' and XSIT.DSC_SIT_SUB_UNID = 'VENDIDO' then 'Nao Sair' 
    else X1.DSC_SIT_VENDA end 'St',
    case when  cast(XV.VR_ITEM  as numeric(20, 2)) < cast(X.VALOR_VENDA   as numeric(20, 2))  then cast(XV.VR_ITEM  as numeric(20, 2))
    else cast(XV.VR_ITEM  as numeric(20, 2))  end 'VLR VGV',
    X1.DSC_SIT_VENDA

    FROM XSUBUNIDADE AS XU 
    INNER JOIN XSITUACAOSUBUNIDADE AS XSIT ON XSIT.COD_SIT_SUB_UNID = XU.COD_SIT_SUB_UNID
    INNER JOIN XTABPRECOSUBUNIDADE AS XP   ON XP.CODPESSEMPR = XU.COD_PESS_EMPR
    AND XP.NUMUNID = XU.NUM_UNID AND XP.NUMSUBUNID = XU.NUM_SUB_UNID 
    AND XP.STATUSVINCULO = '0' AND (XP.RECCREATEDON) < '01/01/2019'
     INNER JOIN XITEMVENDA AS XV ON XV.COD_PESS_EMPR = XU.COD_PESS_EMPR AND XV.NUM_UNID = XU.NUM_UNID
    AND XV.NUM_SUB_UNID = XU.NUM_SUB_UNID
    left JOIN XVENDA         AS X    ON X.NUM_VENDA = XV.NUM_VENDA
    left JOIN XSITUACAOVENDA AS X1 ON X1.COD_SIT_VENDA = X.COD_SIT_VENDA
    WHERE XU.COD_PESS_EMPR 
    IN ('17')


    ORDER BY 1,2

    Obrigado amigos.


    • Editado Ronnie Von terça-feira, 9 de julho de 2019 18:16
    terça-feira, 9 de julho de 2019 18:14

Respostas

  • Ronnie,

    Você vai ter que repetir a mesma condição Case aplicada no Select na cláusula Where, não é permitido fazer uso direto da coluna criada em tempo de execução pelo comando Case.

    Veja este exemplo:

    -- Exemplo 1--
    SELECT NOME , SALDO , SALDO_POUPANÇA , SALDO_APP , VAL_DEPOSITO
    FROM CONTA_CORRENTE
    WHERE
       (
       CASE SALDO
          WHEN SALDO < 0 THEN SALDO_POUPANÇA
          WHEN SALDO = 0 THEN SALDO
          WHEN SALDO > 10000 THEN SALDO_APP
       )  VAL_DEPOSITO
    Go
    
    -- Exemplo 2 --
     SELECT *
      FROM OrdemServico
      WHERE CASE YEAR(OrdemData)
                                     WHEN 2014 THEN 'Ano 1'
                                     WHEN 2013 THEN 'Ano 2'
                                     WHEN 2012 THEN 'Ano 3'
                                     ELSE 'Ano 4 e posteriores' END = 'Ano 1'
    Go

    Ou até mesmo transformar este Select em uma CTE e ai sim fazer uso das colunas declaradas na CTE como condição diretas no Where:

    Veja se este exemplo te ajuda:

    WITH Data (value) AS   
    (   
    SELECT 0   
    UNION ALL   
    SELECT 1   
    )   
    SELECT Value FROM Data
    Where Value >= 1 

    Estes são somente códigos de exemplo, não realizei nenhum teste, pode apresentar ou conter erros.

    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta Ronnie Von segunda-feira, 5 de agosto de 2019 14:54
    terça-feira, 9 de julho de 2019 20:01
  • Deleted
    • Marcado como Resposta Ronnie Von segunda-feira, 5 de agosto de 2019 14:54
    terça-feira, 9 de julho de 2019 20:08

Todas as Respostas

  • Ronnie,

    Você vai ter que repetir a mesma condição Case aplicada no Select na cláusula Where, não é permitido fazer uso direto da coluna criada em tempo de execução pelo comando Case.

    Veja este exemplo:

    -- Exemplo 1--
    SELECT NOME , SALDO , SALDO_POUPANÇA , SALDO_APP , VAL_DEPOSITO
    FROM CONTA_CORRENTE
    WHERE
       (
       CASE SALDO
          WHEN SALDO < 0 THEN SALDO_POUPANÇA
          WHEN SALDO = 0 THEN SALDO
          WHEN SALDO > 10000 THEN SALDO_APP
       )  VAL_DEPOSITO
    Go
    
    -- Exemplo 2 --
     SELECT *
      FROM OrdemServico
      WHERE CASE YEAR(OrdemData)
                                     WHEN 2014 THEN 'Ano 1'
                                     WHEN 2013 THEN 'Ano 2'
                                     WHEN 2012 THEN 'Ano 3'
                                     ELSE 'Ano 4 e posteriores' END = 'Ano 1'
    Go

    Ou até mesmo transformar este Select em uma CTE e ai sim fazer uso das colunas declaradas na CTE como condição diretas no Where:

    Veja se este exemplo te ajuda:

    WITH Data (value) AS   
    (   
    SELECT 0   
    UNION ALL   
    SELECT 1   
    )   
    SELECT Value FROM Data
    Where Value >= 1 

    Estes são somente códigos de exemplo, não realizei nenhum teste, pode apresentar ou conter erros.

    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta Ronnie Von segunda-feira, 5 de agosto de 2019 14:54
    terça-feira, 9 de julho de 2019 20:01
  • Deleted
    • Marcado como Resposta Ronnie Von segunda-feira, 5 de agosto de 2019 14:54
    terça-feira, 9 de julho de 2019 20:08