2015-03-16 21 views
6

Jak mogę policzyć wartości inne niż puste według pola/kolumny? Widzę kilka odpowiedzi, by liczyć według wierszy, ale nie mogę zhakować, jak to zrobić dla kolumn.MySQL COUNT NULL zawartość według kolumny, GROUP według kolumny

Wejście:

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

wyjściowa:

id  4 
field1 4 
field2 3 
field3 2 

Próbuję uzyskać wskaźnik na wykorzystanie pola w bardzo brudnej bazie Mam migracji. W tej bazie danych znajduje się około 50 kolumn, więc szukam podejścia, które nie wymaga wpisywania nazwy każdej kolumny.

mogę również przedłużyć ten przeszukiwanie do niezerowe & to-nie-pusty & ≠ 0 & ≠ „nie” z powodu niespójności w przechowywaniu danych - niektóre pola nie zostały wykorzystane, ale auto wypełnione „nie” .

Ta odpowiedź wygląda blisko tego, co muszę, ale generuje błąd SQL i nie mam wystarczającej reputacji komentować: Count number of NULL values in each column in SQL

+0

Aktualizacja: używam MySQL nie SQL czy to robi różnicę. – Slam

Odpowiedz

3

Wystarczy użyć count():

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

To właśnie count() robi - - Zlicza wartości inne niż NULL.

Jeśli masz awersję do wpisywania nazw, użyj tabel metadanych (zazwyczaj information_schema.columns), aby uzyskać nazwy kolumn. Możesz wygenerować SQL jako zapytanie lub skopiować nazwy kolumn do arkusza kalkulacyjnego, aby wygenerować kod.

EDIT:

Można wygenerować kod za pomocą:

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

Uwaga ta wykorzystuje mało znany zdolność group_concat() do podjęcia wiele argumentów ciągów.

+0

IS IT .. Właśnie nauczyłem się nowych rzeczy .. – sumit

+0

ale kiedy próbowałem to jest liczenie NULL danych też – sumit

+0

@gordon linoff, myślę, że użytkownik chce wiersz mądry danych, a nie kolumny mądry. –

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 

Jeśli występują jedynie 3 STAŁY polu nad SQL BĘDZIE PRACOWAĆ

+2

Używaj związku wszystko raczej –

+1

Jest około 50 pól. To działałoby, gdybym chciał je wszystkie wypisać. – Slam

+0

Tak naprawdę nie potrzebujesz "UNION ALL", chyba że niektóre nazwy kolumn są takie same, co nie jest możliwe. –

0

Oto 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; 
Powiązane problemy