No entiendo cómo lograr el nombre de la columna en función del estado, creo que no es posible mostrar varios nombres de columna para el mismo, pero tengo este requisito de mostrar el nombre de la columna 'Correcto' o 'Error' y ambos estados nunca se recuperan , Tengo que seleccionar solo uno a la vez, ya sea 0 o 1, según la condición, el valor se define en la variable.

CREATE TABLE #sqlJobHistory(jobId INT, jobStatus INT)
INSERT INTO #sqlJobHistory VALUES 
(1, 0),
(2, 0),
(3, 1),
(4, 1),
(5, 1),
(6, 0),
(7, 1)

Quiero mostrar el nombre de mi segunda columna según el estado. Hasta ahora probé la línea comentada pero :(

SELECT MAX(jobId) maxJobId, 
    COUNT(*) AS 'Failure' --AS CASE WHEN jobStatus = 0 THEN 'Fail' ELSE 'Success' END 
FROM #sqlJobHistory 
WHERE jobStatus = 0 
GROUP BY jobStatus

Si es posible, ¿puede ayudarnos a determinar cuál es la forma correcta de lograr el resultado deseado? Si no es posible, lamento mucho haber perdido su valioso tiempo.

0
Fever 10 dic. 2016 a las 07:56
¿Puede ser más específico lo que quiere lograr? P.ej. la salida exacta? En principio, no creo que sea posible que el nombre de una columna dependa de alguna condición dependiente de los datos.
 – 
Marcin Zukowski
10 dic. 2016 a las 08:47
Creo que quiere el nombre de la segunda columna como 'Éxito' qué estado = 1 o 'Fallo' cuando el estado = 0
 – 
Susang
10 dic. 2016 a las 09:34
Sí, exactamente lo quiero
 – 
Fever
10 dic. 2016 a las 11:28

1 respuesta

La mejor respuesta

Sí, puede ser posible a través de una consulta dinámica, si lo entiendo correctamente, el nombre de la segunda columna es 'Éxito' si Estado = 1 en caso contrario 'Fallo'

DECLARE @status INT, @sql VARCHAR(500)
SET @status = 1 --It can be 0 or 1 and I think you already have this variable

SET @sql ='
    SELECT MAX(jobId) maxJobId, 
    COUNT(*) AS ' + 
    CASE WHEN CAST(@status AS VARCHAR)= 0 THEN 'Failure' ELSE 'Success' END + '
FROM #sqlJobHistory 
WHERE jobStatus = ''' + CAST(@status AS VARCHAR) + '''
GROUP BY jobStatus'

EXEC(@sql)
1
Susang 10 dic. 2016 a las 09:37