Usuário com melhor resposta
Condição do Case

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 EfetivadaOs 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,2Obrigado amigos.
- Editado Ronnie Von terça-feira, 9 de julho de 2019 18:16
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
-
Deleted
- Marcado como Resposta Ronnie Von segunda-feira, 5 de agosto de 2019 14:54
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
-
Deleted
- Marcado como Resposta Ronnie Von segunda-feira, 5 de agosto de 2019 14:54