2012-04-11 8 views
5

Tengo que escribir una declaración de caso que devolveráinstrucción Case que añade la columna valora

“1 of 3” if someone voted in one of three elections, 
“2 of 3” if someone voted in two of three elections, 
“3 of 3” if someone voted in three of three elections, 

El problema es que algunos de los valores son un varchar y algunos son nulas y no pueden sumarlos. Esta es mi idea pero no puedo hacer que funcione.

select 
id, 
CASE 
    WHEN race1 + race2 + race3 = 0 then '0-3' 
    WHEN race1 + race2 + race3 = 1 then '1-3' 
    WHEN race1 + race2 + race3 = 2 then '2-3' 
    WHEN race1 + race2 + race3 = 3 then '3-3' 
    WHEN race1 + race2 + race3 is null then 'Unknown' 
END AS General_Turnout 
from test4 

http://sqlfiddle.com/#!3/cac66/3

Respuesta

9

Esto debería funcionar:

select 
id, 
    CAST((CASE WHEN race1 IS NOT NULL THEN 1 ELSE 0 END) 
    +(CASE WHEN race2 IS NOT NULL THEN 1 ELSE 0 END) 
    +(CASE WHEN race3 IS NOT NULL THEN 1 ELSE 0 END) AS CHAR) + '-3' 
AS General_Turnout 
from test4 
0

uso COELESCE (valor 0) para que nulo se toma como cero

+0

Sí me trataron IsNull (race1, 0), en todos y que elimina los valores nulos y los reemplaza por 0, pero todavía no puedo agregar el resto. Gracias – user973671

+0

Puedes utilizar el elenco para la conversión. Creo que el ejemplo ya está dado anteriormente –

0

Por lo informados sobre SQLfiddle, supongo NULL significa no votó y cualquier cadena significa si votó. No se puede agregar las cuerdas no numéricos que tiene en columnas race1, Carrera 2 y raza 3, pero esto debería funcionar:

SELECT 
    id, 
    CAST(
    CASE WHEN race1 IS NOT NULL then 1 ELSE 0 END + 
    CASE WHEN race2 IS NOT NULL then 1 ELSE 0 END + 
    CASE WHEN race3 IS NOT NULL then 1 ELSE 0 END 
    AS CHAR) + '-3' AS General_Turnout 
FROM test4 
Cuestiones relacionadas