none
utilizar el alias de un case en un where sql server RRS feed

  • Pregunta

  • Cordial saludo

    Que alternativas tengo para utilizar el alias de un case en una sentencia where?

    Para mostrar el resultado del case funciona bien pero cuando quiero usar ese resultado en un where no lo hace, solo trae el valor de ese campo; aqui un ejemplo:

    declare @P_NumCre INT
    declare @Sdt_FecPag smalldatetime
    set @P_NumCre = 4996
    set @Sdt_FecPag = '09/04/2018'
    
    SELECT 
    	vic.crenumero
    	, isnull(pp3.Ti_UltCuoVen, 0) as Ti_UltCuoVen 
    	, case 
    			when pp3.Ti_UltCuoVen = 36 then vic.crefechgeneinte
    			else pp3.Sdt_FecUltCuoVen 
    		end AS Sdt_FecUltCuoVen
    	, isnull(dia.D_IntCorCS, 0) as D_IntCorCS
    FROM 
    	dbo.vistintecorr as vic
    outer apply(
    	--Fecha y Ultima cuota vencida
    	SELECT 
    		pp3.ppcuota as Ti_UltCuoVen
    		, pp3.ppfecha as Sdt_FecUltCuoVen
    	FROM 
    		planpago as pp3 
    	WHERE 
    		pp3.crenumero = vic.crenumero 
    		AND pp3.ppfecha <= @Sdt_FecPag
    		AND pp3.ppcuota = (
    						SELECT MAX(ppcuota) FROM planpago as pp4 
    						WHERE pp4.crenumero = pp3.crenumero 
    						AND pp4.ppfecha <= @Sdt_FecPag
    						)
    ) as pp3
    outer apply(
    	--SUMO LOS INTERESES CORRIENTES QUE DEBE QUE FUERON CAUSADO NORMALMENTE
    	SELECT SUM(dia.diavalointe - dia.diaabonsubs) as D_IntCorCS 
    	FROM 
    		diario as dia 
    	WHERE dia.crenumero = vic.crenumero 
    		AND dia.diaestado = 'CS'
    		AND dia.diafecha < Sdt_FecUltCuoVen
    ) as dia
    WHERE
    	(vic.crenumero % 2) = 0
    

    Agradezco de antemano la ayuda que me puedan brindar

    viernes, 13 de abril de 2018 14:55

Todas las respuestas

  • Hola carlostattojk:

    Si te refieres a usar en el where el alias de case en la select, tal cual lo planteas, ninguna.

    El orden de evaluación es

    1. FROM
    2. ON
    3. OUTER
    4. WHERE
    5. GROUP BY
    6. CUBE | ROLLUP
    7. HAVING
    8. SELECT
    9. DISTINCT
    10 ORDER BY
    11. TOP

    Sin evaluar tu consulta, eso no implica que en el where, puedes volver a realizar el mismo case.

    ¿Esto responde tu duda?

    Un saludo

    viernes, 13 de abril de 2018 15:52
  • La única alternativa es un CTE.  Calcula el CASE en el CTE, luego ya lo puede usar consistentemente en las demás consultas.

    Jose R. MCP
    Code Samples

    viernes, 13 de abril de 2018 15:52
  • Ya lo solucione colocando el case dentro del outer apply; una consulta mas puedo retornar 2 variables del case ?

    declare @fechhoy smalldatetime
    declare @ConCuo int 
    declare @ultcuopag int 
    set @fechhoy = '2018-04-19'
    set @ConCuo = 1
    set @ultcuopag = 8
    
    select 
    	vic.crenumero
    	, vic.crefechgeneinte
    	UltCuoVen
    from 
    	vistintecorr as vic
    outer apply(
    	select(
    		case
    			when @ConCuo > 0
    			then(
    				select 
    					pp4.ppcuota as UltCuoVen/*, 
    					pp4.ppfecha as UltFecVen*/
    				from 
    					planpago as pp4
    				where 
    					pp4.crenumero = vic.crenumero 
    					and pp4.ppfecha <= @fechhoy
    					AND pp4.ppcuota = @ultcuopag
    			)
    		end
    	) as UltCuoVen--, UltFecVen
    ) as pp3
    WHERE
    	(vic.crenumero % 2) = 0
    order by 
    	vic.crenumero ASC
    	, vic.crefechgeneinte

    Resalto en negrita las dos variables que quiero retornar del case pero solo me permite uno; hay otra opcion para realizar eso?

    Agradezco de antemano la ayuda que me puedan brindar


    jueves, 19 de abril de 2018 14:35
  • prueba a cambiar 
    outer apply(
    				select 
    					pp4.ppcuota as UltCuoVen/*, 
    					pp4.ppfecha as UltFecVen*/
    				from 
    					planpago as pp4
    				where 
    					pp4.crenumero = vic.crenumero 
    					and pp4.ppfecha <= @fechhoy
    					AND pp4.ppcuota = @ultcuopag
    	and @ConCuo>0
    
    ) as pp3
    


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    jueves, 19 de abril de 2018 16:28
    Moderador