2017-10-02 2 views
3

Ich versuche, eine kurze SQL-Abfrage (in MySQL Workbench) zu schreiben, die die Anzahl der Fehler in einem Thema ausgibt, wenn es von mehr als einem Schüler fehlgeschlagen ist.SQL IS NOT NULL funktioniert nicht

Hier ist mein Versuch:

SELECT CONCAT(area, yearlevel, code) AS SubjectCode, Count(student) 
FROM StudentTakesSubject 
WHERE result < 50 AND result <> NULL 
GROUP BY code 
HAVING Count(Student) > 1; 

Das Problem ist, es hält den Zählwert ausgibt, der die Null-Datensatz enthält, obwohl ich in der Abfrage angegeben haben, nicht, sie zu zählen (oder zumindest dachte ich, ich habe .. .).

EDIT: Es war die GROUP BY Klausel, die falsch ging! Als hat Gordon Linoff in seiner Antwort darauf hingewiesen, es hätte GROUP BY SubjectCode sein müssen und das magisch das Problem gelöst.

Vielen Dank für die konstruktiven Einsichten.

+1

SQL SERVER oder MySQL – Ravi

+3

Ändern Sie 'result <> NULL' durch' result IS NOT NULL'. – wchiquito

+0

Nicht so, dass 'NULL' Ergebnisaufzeichnungen zählen' Ergebnis <50' wird herausgefiltert 'NULL's' –

Antwort

6

Wie geschrieben:

SELECT CONCAT(area, yearlevel, code) AS SubjectCode, Count(student) 
FROM StudentTakesSubject 
WHERE result < 50 AND result <> NULL 
GROUP BY code 
HAVING Count(Student) > 1; 

Diese Abfrage keine Zeilen zurückgeben sollte. Warum? result <> NULL gibt NULL als booleschen Wert zurück (in guter Näherung alle Vergleiche mit NULL zurück NULL). wertet NULL aus - und NULL ist nicht wahr. Alle Zeilen werden herausgefiltert.

Der NULL Vergleich ist eigentlich überflüssig. Die result < 50 wird auch NULL Werte herausfiltern.

Mit Blick auf den Rest der Abfrage haben Sie ein anderes Problem. Die GROUP BY ist auf code. Es sollte wirklich auf SubjectCode sein - das Ergebnis der CONCAT(). Tatsächlich würde ich beim Verketten verschiedener Spalten die Verwendung eines Trennzeichens empfehlen, beispielsweise CONCAT_WS(':', area, yearlevel, code). Natürlich ist ein Separator für diese spezielle Situation nicht wünschenswert.

+0

Aber in meinen Datensätzen zähle ich klar, dass es nur zwei geben soll, solange es noch 3 ausgibt ... Es sei denn, meine Augen lügen mich alle an, die ich mehrfach per Hand gezählt habe ... –

+0

Na magisch, nach Gruppenwechsel von zu SubjectCode, das Problem wurde gelöst ... –

+0

Vielen Dank, Sir, um anderen klar zu machen, dass es in der Zukunft möglich ist, würde es mir möglich sein, meine eigene Frage zu beantworten und dabei auf Ihre Vorschläge als Hauptursache zu verweisen dieses Problem. –

0

result NOT NULL anstelle von result <> NULL.

SELECT CONCAT(area, yearlevel, code) AS SubjectCode, Count(student) 
FROM StudentTakesSubject 
WHERE result < 50 
AND result NOT NULL 
GROUP BY code 
HAVING Count(Student) > 1; 
Verwandte Themen