2010-07-26 17 views
5

Ho una tabella con una colonna che consente i valori nulli. Se il valore è nullo è incompleto. Voglio calcolare la percentuale completa.Ottieni la percentuale delle colonne completate calcolando valori nulli

Questo può essere fatto in MySQL tramite SQL o devo ottenere le voci totali e le voci totali nulle e calcolare la percentuale sul server?

In entrambi i casi, sono molto confuso su come devo andare a separare il valore variabile in modo da ottenere i risultati totali e anche i risultati NULL totali.

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

Questo mi dà tutti i giochi in cui il valore_valore è NULL. Come estendo questo per ottenere anche i giochi o i giochi TOTAL NOT NULL insieme a questo?

Tabella Schema:

id (INT Primaria Auto-Inc)

category_id (INT)

VARIABLE_VALUE (testo permettono Null default: NULL)

+0

puoi darci lo schema della tabella? – JNK

risposta

11

Quando si utilizza "Conte" con un nome di colonna, i valori nulli non sono inclusi. Quindi, per ottenere il conteggio o percentuale non nullo solo fare questo ...

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: questa è stata anche la mia idea: colonna calcolata, dividendo l'importo per il numero di istanze non nulle. Stavo pensando 'SUM (COALESCE (valore, 0)/COUNT (...)' me stesso ... –

+0

modifica: Aggiunte altre opzioni "totali" –

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' 

Potrebbe essere necessario fare un po 'di colata sul SUM() in modo da ottenere un numero decimale.

+0

+1: Vedi il mio commento a Carter. –

+0

Sì, gli ho dato anche un +1, mi piace che gli aggregati su NULL possano portare a codice più conciso, anche se di default quando inizio a digitare vado a verbose :) –

2

per contare il numero di voci che corrispondono alla dichiarazione WHERE, utilizzare COUNT(*)

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

Se si vuole sia il numero totale di righe e quelli con VARIABLE_VALUE essere NULL in un'istruzione, provare GROUP BY

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

Restituisce qualcosa come

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

==> 12 voci hanno NULL in quella colonna, 193 Havn't

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