2010-02-25 9 views
8

Ich muss die nicht leeren Zeilen zählen (um die ich eine Zeichenfolge mit mindestens 1 Zeichen bedeute), die nach einer bestimmten ID gruppiert sind. Z.B. meine Daten könnte wie folgt aussehen:Zähle und gruppiere nicht leere Werte in MySQL

form_id mapping 
1   'value_1' 
1   '' 
1   'value_2' 
2   '' 
2   NULL 
3   'value_3' 

und ich möchte die nicht leere Werte für jede Form zählen, so möchte ich die Ergebnisse wie folgt aussehen:

form_id mapping_count 
1   2 
2   0 
3   1 

Wenn die leeren Werte waren alle NULL, ich denke, ich

SELECT form_id, count(mapping) FROM table GROUP BY form_id 

verwenden könnte ... aber das leere Zeichenfolgen in der Zählung würde, was ich nicht will.

Ich könnte eine WHERE-Klausel verwenden, um nur Zeilen zurückzugeben, wo ein Wert in der Mapping-Spalte vorhanden ist, aber ich möchte die Formular-IDs zurückgeben, die keine Zuordnungen haben, also das ist auch nicht gut.

Ich vermute, ich brauche eine Unterabfrage von irgendeiner Art, aber habe Probleme beim Zusammensetzen.

Antwort

13
SELECT form_id, COUNT(NULLIF(TRIM(mapping), '')) 
FROM mytable 
GROUP BY 
     form_id 

Dies wird nicht Aufzeichnungen zählen, die nicht mindestens ein Nicht-Leerzeichen enthält (einschließlich Leerzeichen Strings, leere Strings und NULL s).

Wenn eine nicht-leere all-whitespace String gültig ist, verwenden Sie diese:

SELECT form_id, COUNT(NULLIF(mapping, '')) 
FROM mytable 
GROUP BY 
     form_id 
+0

Große, vielen Dank für das - ich hatte vorher nicht kommen über die NULLIF Funktion. Genau das, was ich brauchte. :) – Russ