2010-07-26 38 views
5

Tengo una tabla con una columna que permite valores nulos. Si el valor es nulo, está incompleto. Quiero calcular el porcentaje completo.Obtener el porcentaje de columnas que se completaron mediante el cálculo de valores nulos

¿Se puede hacer esto en MySQL a través de SQL o debería obtener el total de entradas y el total de entradas nulas y calcular el porcentaje en el servidor?

De cualquier manera, estoy muy confundido sobre cómo debo separar el variable_valor para que pueda obtener sus resultados totales y también sus resultados NULL totales.

SELECT 
    games.id 
FROM 
    games 
WHERE 
    games.category_id='10' AND games.variable_value IS NULL 

Esto me da todos los juegos donde el variable_valor es NULL. ¿Cómo extiendo esto para obtener también los juegos TOTAL o los juegos NOT NULL junto con eso?

tabla de esquema:

id (INT Primaria Auto-Inc)

category_id (INT)

valor_variable (texto permiten defecto NULL: NULL)

+0

Puede darnos el esquema de la tabla? – JNK

Respuesta

11

Cuando se utiliza "Count" con un nombre de columna, los valores nulos no están incluidos. Así que para obtener el recuento o porcentaje no nula acaba de hacer esto ...

SELECT 
    count(1) as TotalAll, 
    count(variable_value) as TotalNotNull, 
    count(1) - count(variable_value) as TotalNull, 
    100.0 * count(variable_value)/count(1) as PercentNotNull 
FROM 
    games 
WHERE 
    category_id = '10' 
+2

+1: Esa fue mi idea también: columna calculada, dividiendo el monto por el número de instancias no nulas. Estaba pensando 'SUMA (COALESCE (valor, 0)/COUNT (...)' yo mismo ... –

+0

editar: Agregué otras opciones "totales" –

5
SELECT 
    SUM(CASE WHEN G.variable_value IS NOT NULL THEN 1 ELSE 0 END)/COUNT(*) AS pct_complete 
FROM 
    Games G 
WHERE 
    G.category_id = '10' 

Es posible que tenga que hacer algún colado en el SUM() de forma que se obtiene un decimal.

+0

+1: Vea mi comentario a Carter. –

+0

Sí, le di a +1 también. Me gusta que los agregados en NULL pueden conducir a un código más conciso, aunque de forma predeterminada cuando empiezo a escribir voy por verbose :) –

2

para contar el número de entradas que coincidan con su instrucción WHERE, utilice COUNT(*)

SELECT COUNT(*) AS c FROM games WHERE games.variable_value IS NULL 

Si desea que el número total de filas y los que tienen valor_variable ser NULL en una afirmación, que GROUP BY

SELECT COUNT(variable_value IS NULL) AS c, (variable_value IS NULL) AS isnull FROM games GROUP BY isnull 

devoluciones algo así como

c | isnull 
============== 
12 | 1 
193 | 0 

==> 12 entradas tienen NULL en la columna, 193 Havn't

==> Porcentaje: 12/(12 + 193)

Cuestiones relacionadas