2009-08-13 12 views
4

Sagen wir, ich auf den Tisch habenListing

NAME | ID | REF 
foo1 | 1 | NULL 
foo2 | 2 | 1234 
foo2 | 3 | 567 
foo1 | 4 | NULL 
foo3 | 5 | 89 

Ich möchte alle Instanzen von NULL zählen und NOT NULL in einer Abfrage so, dass ich

NAME | null | not null 
foo1 | 0 | 2 
foo2 | 2 | 0 
foo3 | 0 | 1 
sagen kann,

ich konnte diese beiden Abfragen

select NAME,count(*) from TABLE where REF is not null 
select NAME,count(*) from TABLE where REF is null 

Aber ich bin sicher, es laufen eine einfache Möglichkeit, es in einer mySQL-Abfrage zu tun sein muss.

Antwort

10

können Sie verwenden SUM() auf ISNULL() wie dieses

select NAME, sum(isnull(REF)) as is_null, sum(not isnull(REF)) as is_not_null from TABLE group by NAME; 

SUM (1) entspricht COUNT (*), so wird es wirklich eine Zählung machen.

1

Wenn es mit einer Lösung in Ordnung ist, die Sie verwendet Gruppierung kann wie etwas versuchen:

SELECT ISNULL(ref),COUNT(*) FROM TABLE GROUP BY ISNULL(ref) 

Mindestens es sagt Ihnen, wie viele Zeilen mit einem NULL in ref Sie haben. Diese Lösung (gut oder nicht) könnte mit einer Auswahl von GROUP_CONCAT für NAME erweitert werden, wenn Sie jeden einzelnen Namen auswählen müssen.

0

Ich denke, MySQL eine IF() Funktion hat, so könnten Sie schreiben:

SELECT Name, SUM(IF(ISNULL(Ref), 1, 0)) AS NullCount, 
     SUM(IF(ISNULL(Ref), 0, 1)) AS NotNullCount 
FROM Table GROUP BY Name 

Sie sind also die IF() Funktion, um entweder eine Null oder eine Eins für jede Zeile, und summieren sie, um die Gesamtzahl der "Einsen" zu erhalten.