2011-08-02 8 views
5

Me gustaría saber si es posible en una consulta SQL reemplazar algunos valores por otra cosa, o si tengo que hacer eso en el postprocesamiento.¿Es posible reemplazar valores en la consulta SQL?

Déjame explicarte. Tengo esta tabla:

|username| accepted | 
|--------|----------| 
| toto | NULL | 
|--------|----------| 
| foo | 0  | 
|--------|----------| 
| Rick | 1  | 
|--------|----------| 
| bar | 1  | 
|--------|----------| 

Quiero saber el número de fila por cada valor de accepted (bit anulable). Estoy corriendo esta consulta:

SELECT [accepted], count(*) FROM my_table GROUP BY [accepted] 

que debe devolver:

NULL 1 
false 1 
true 2 

¿Hay alguna manera de reemplazar los valores por accepted etiquetas más significativas? Idealmente me gustaría tener algo como:

not_available 1 
not_accepted 1 
accepted  2 

¿Es eso factible con SQL Server 2008 R2?

Thx. No

SELECT decode(accepted,NULL,'not_available' ,1,'accepted',0,'not_accepted'),count(*) 
FROM my_table GROUP BY 
decode(accepted,NULL,'not_available' ,1,'accepted',0,'not_accepted') 

se debe dar salida como desee ..

puede ser función de decodificación está allí, entonces se puede utilizar -

+0

Una alternativa sería dejar que su aplicación manejar los literales. – niktrs

Respuesta

11

Si usted tiene unos valores:

SELECT CASE [accepted] 
WHEN 0 THEN 'not_accepted' 
WHEN 1 THEN 'accepted ' 
ELSE 'not_available' END AS accepted 
, count(*) 
FROM my_table 
GROUP BY CASE [accepted] 
WHEN 0 THEN 'not_accepted' 
WHEN 1 THEN 'accepted ' 
ELSE 'not_available' END 
+0

, de hecho, aparece un error con la condición GROUP BY: "Column 'ValidationStats.accepted' no es válido en la lista de selección porque no está contenido ni en una función de agregado ni en la cláusula GROUP BY". Sin embargo, eso funciona bien simplemente con GROUP BY [aceptado]. – Antoine

+0

¿puedes publicar el código? I runned el código exacto contra datos de la muestra y se está trabajando – niktrs

+0

caso SELECT [updateaccepted] cuando 0 entonces 'no autorizados' cuando 1 entonces 'aceptados' otro 'no disponible' termina , COUNT (*) DE ValidationStats GRUPO POR CASO [updateaccepted] CUANDO 0 ENTONCES 'no se aceptan' CUANDO 1 ENTONCES 'aceptados' ELSE 'no disponible' FIN – Antoine

1

sí que está ahí ... puede modificar la consulta de la siguiente case por allí ..

SELECT 
case accepted 
    WHEN 1 THEN 'accepted' 
    WHEN 0 THEN 'not_accepted' 
    ELSE 'not_available' 
end,count(*) 
    FROM my_table GROUP BY  
case accepted 
    WHEN 1 THEN 'accepted' 
    WHEN 0 THEN 'not_accepted' 
    ELSE 'not_available' end 
+4

decodificar no está en SQL Server ... – gbn

+1

AFAIK SQL Server no tiene DECODE. Además, al igual que una forma de guardar al escribir, no es necesario agrupar por DECODE completo, sino solo el campo aceptado, ya que la relación entrada: resultado es 1: 1. Solo necesitaría agrupar por el DECODE completo si dos o más entradas diferentes se asignan al mismo resultado. – MatBailie

+1

Es solo un oráculo, creo que – niktrs

3

uso de una maleta

SELECT 
    CASE [accepted] 
     WHEN 1 THEN 'accepted' 
     WHEN 0 THEN 'not_accepted' 
     ELSE 'not_available' --NULL 
    END AS [accepted], count(*) 
FROM my_table 
GROUP BY --try [accepted] by itself first 
    CASE [accepted] 
     WHEN 1 THEN 'accepted' 
     WHEN 0 THEN 'not_accepted' 
     ELSE 'not_available' --NULL 
    END 

Es posible que deba utilizar todo el CASO en el GROUP BY. A menos que hacer esto

SELECT 
    CASE [accepted] 
     WHEN 1 THEN 'accepted' 
     WHEN 0 THEN 'not_accepted' 
     ELSE 'not_available' --NULL 
    END AS [accepted], CountOfAccepted 
FROM 
    (SELECT [accepted], count(*) AS CountOfAccepted 
    FROM my_table GROUP BY [accepted]) foo 
+0

Según tengo entendido, no existe la necesidad sintáctica de agrupar por toda la instrucción CASE.Solo sería Funcionalmente necesario si dos o más valores en el campo Aceptado asignados a la misma cadena (Para evitar que la cadena aparezca varias veces en el conjunto de resultados final). – MatBailie

+0

@Dems: probablemente, no recuerdo cuando SQL Server me molesta por estas cosas – gbn

+1

@gbn - para la versión "foo", si el segundo "count (*)" fuera algo así como "count (*) como count_accepted" , y el primer "conteo (*)" debe ser "count_accepted"? –

2
SELECT 
    CASE [accepted] 
     WHEN 1 THEN 'accepted', 
     WHEN 0 THEN 'not accepted', 
     ELSE 'not available' 
    END AS [accepted], 
    count(*) 
FROM my_table GROUP BY [accepted] 

?

No estoy seguro si esto es exactamente correcto y no tengo SQL Server disponible para probar ahora, pero debería ser algo así.

EDIT: aww, ya publicado

Cuestiones relacionadas