2015-03-16 20 views
6

Come posso contare le voci non null per campo/colonna? Vedo diverse risposte da contare per riga, ma non posso modificare il modo in cui farlo per le colonne.MySQL COUNT NULL contenuto per colonna, GROUP per colonna

ingresso:

╔════╦════════╦════════╦════════╗ 
║ id ║ field1 ║ field2 ║ field3 ║ 
║ 1 ║ do  ║ re  ║ me  ║ 
║ 2 ║ fa  ║  ║ so  ║ 
║ 3 ║ la  ║ te  ║  ║ 
║ 4 ║ da  ║ re  ║  ║ 
╚════╩════════╩════════╩════════╝ 

uscita:

id  4 
field1 4 
field2 3 
field3 2 

Sto cercando di ottenere un indicatore dell'uso campo in un database molto sporco sto migrando. Ci sono circa 50 colonne in questo database, quindi sto cercando un approccio che non implichi la digitazione di ogni nome di colonna.

potrei anche dover estendere tale ricerca non NULL & è-non-vuoto & ≠ 0 & ≠ "no" a causa di incongruenze nella memorizzazione dei dati - alcuni campi non sono mai stati utilizzati, ma auto-pieni di "no" .

Questa risposta sembra vicino a quello che mi serve, ma genera un errore di SQL e non ho abbastanza fama di commentare: Count number of NULL values in each column in SQL

+0

Aggiornato: Sto usando MySQL non SQL se questo fa la differenza. – Slam

risposta

3

Basta usare count():

select count(field1), count(field2), count(field3) 
from table t; 

Questo è ciò che fa count() - - Conta valori non NULL.

Se si ha una certa avversione a digitare i nomi, utilizzare le tabelle dei metadati (in genere information_schema.columns) per ottenere i nomi delle colonne. È possibile generare SQL come query o copiare i nomi delle colonne in un foglio di calcolo per generare il codice.

EDIT:

È possibile generare il codice utilizzando:

select group_concat('count(', column_name, ')' separate ', ') 
from information_schema.columns 
where table_name = <whatever> and table_schema = <whatever2>; 

Nota questo utilizza la poca capacità conosciuto di group_concat() di prendere più argomenti di stringa.

+0

È ... ho appena appreso nuove cose .. – sumit

+0

ma quando ho provato è contare anche i dati NULL – sumit

+0

@gordon linoff, penso che l'utente voglia dati di riga saggio, non di colonna saggio. –

2
SELECT count(field1) as cnt ,'field1' as field from tbl where field1 IS NOT NULL 
UNION all 
SELECT count(field2) as cnt ,'field2' as field from tbl where field2 IS NOT NULL 
union all 
SELECT count(field3) as cnt ,'field3' as field from tbl where field3 IS NOT NULL 

se ci sono solo 3 FISSO CAMPO SOPRA SQL funzionerà

+2

Usa unione tutto piuttosto –

+1

Ci sono circa 50 campi. Questo funzionerebbe se volessi scriverli tutti. – Slam

+0

Non hai davvero bisogno di 'UNION ALL' a meno che alcuni nomi di colonna siano uguali, il che non è possibile. –

0

Ecco sqlfiddle

SELECT 
    COUNT(id), 
    SUM(CASE WHEN field1 IS NOT NULL THEN 1 ELSE 0 END), 
    SUM(CASE WHEN field2 IS NOT NULL THEN 1 ELSE 0 END), 
    SUM(CASE WHEN field3 IS NOT NULL THEN 1 ELSE 0 END) 
FROM table1; 
Problemi correlati