SQL Count soll auch Null-Werte mitzählen

darton

Lt. Junior Grade
Registriert
Okt. 2004
Beiträge
282
Hallo!
Ich habe ein paar Tabellen in meiner Datenbank, in denen Personen enthalten sind und welche Kurse sie besuchen. Ich möchte gerne nun die Kursnamen angezeigt bekommen und daneben soll stehen, wie viele Leute jeweils die Kurse besuchen. Das funktioniert auch alles so weit ganz gut, nur habe ich das Problem, dass manche Kurse von niemandem besucht werden, d.h. die SQL-Funktion count() müsste als Anzahl eigentlich 0 zurückliefern, aber count() berücksichtigt ja keine null-Werte, sodass dieser Kurs einfach nicht angezeigt wird.
Wie kann ich meine SQL-Abfrage modifizieren, sodass in der Spalte 'anzahl' der Wert 0 angezeigt wird, wenn keiner den Kurs besucht?
Code:
SELECT name, count( kurse.id ) AS anzahl
FROM belegen, kurse 
WHERE belegen.kid = kurse.id
GROUP BY kurse.id
 
vielleicht indem du die werte durch ein "+1" vor der count opperation künstlich hochzählen lässt und dann vor der ausgabe durch "-1" auf jedes objekt wieder den richtigen wert ausgibst?!
ist sicher keine elegante, aber praktikable lösung.
 
Bitte poste mal die Struktur der notwendigen Tabellen damit dir geholfen werden kann. Die Idee von wertewandel halte ich für weniger elegant oder zielführend.

Sobald ich die Struktur gesehen habe, kann ich mehr dazu sagen. Evtl auch mit Beispieldatensätze und Zielergebnis, das wäre hilfreich.
 
IF anzahl = null (kann auch 'null' sein) THEN SET anzahl = 0 oder sowas. Oder lass in der Tabelle halt per se schon keine null Werte zu.
 
Probiers mal mit count( * ), aber ohne die Datenbank-Struktur zu kennen ist das wirklich schwierig :)

EDIT1:
Habs mir nochmal genau durchgelesen und würde einen outer join mit deinem count(id) verwenden.

EDIT2:
@SC6, wieso sum(count(*))?
 
Zuletzt bearbeitet:
Was ich hier so lese kann doch echt nur ins blaue geraten sein! count(*) sollte keinerlei Auswirkungen haben. Und das IF Konstrukt ist ganz sicher auch nicht die Lösung.

Ich bin mir ziemlich sicher, dass das Problem darin liegt, dass durch den inner join schlicht die Datensätze ausgefiltert werden. Outer join in Verbindung mit sum(count(*)) ist aus meiner Sicht der richtige Ansatz. Aber auch das ist nur geraten, bis man die Struktur kennt!

edit: Achso die Angabe des verwendeten DBMS wäre auch hilfreich!
 
SELECT name, count( kurse.id ) AS anzahl
FROM belegen, kurse
WHERE belegen.kid = kurse.id and name is null
GROUP BY kurse.id

dann bekommste, glaub ich, die die null sind. über n unique oder distinct - verwechsel die beiden gerade - kannst du die beiden mengen vereinen.
 
She das auch so wie SC6, das SELECT ... FROM ... WHERE entspricht einem inner join.
Was hier gefordert ist, kann es aber nicht liefern. Das sollte aber ein outer join schaffen.

Es ist schon spät und ich hab die DB nicht vorliegen, in mysql könnte das vielleicht so aussehen (wenn ich LEFT und RIGHT nicht wieder vertauscht habe):

Code:
SELECT name, count(*) AS Anzahl
FROM belegen
RIGHT OUTER JOIN kurse
ON belegen.kid = kurse.id
GROUP BY kurse.id


PS: DBMS und Aufbau der Tabellen wären sehr hilfreich
 
Das ist wirklich alles Rätseltraterei wir sollten warten bis er das Design gepostet hat.

@evilbaschdi:
Du meinst bestimmt union. unique ist das es nur eindeutige Werte geben kann und mit distinct filterst du Duplikate raus.
 
Zuletzt bearbeitet:
Achso, ok. Ich verwende MySQL.
Hier mal Beispieldaten, wie die Tabellen 'Kurse' und 'belegen' aussehen.

Kurse:
Code:
 ID | Name
--------------------
 1  | Mathe I
 2  | Informatik A
 3  | Zeitmanagement
 4  | Philosophie

belegen:
Code:
 pid  |  kid
----------------
  1   |   1
  1   |   2
  2   |   1
  2   |   3
  3   |   2
  4   |   2
Wobei pid für Personen-ID und kid für Kurs-ID steht.
Das Ergebnis der SQL Abfrage aus dem ersten Post sollte also so sein:
Code:
 name                |  anzahl
---------------------------------
Mathe I              |    2
Informatik A         |    3
Zeitmanagement       |    1
Philosophie          |    0
Allerdings wird die letzte Zeile eben nicht angezeigt, weil der Kurs Philosophie keine Teilnehmer hat und count() null-Werte nicht berücksichtigt. Er soll aber mit der Anzahl 0 angezeigt werden. Dahingehend müsste meine SQL Abfrage modifiziert werden.

Edit: Mit right outer join sieht das ganze schon ganz gut aus. Hatte bisher nur left outer join getestet. Allerdings wird dann bei anzahl eine 1 angegeben, anstatt einer 0.
 
Zuletzt bearbeitet:
Probier das mal:

SELECT name, count(belegen.pid) AS Anzahl
FROM Kurse
LEFT OUTER JOIN belegen
ON kurse.ID = belegen.kid
GROUP BY kurse.id
 
Zuletzt bearbeitet:

Ähnliche Themen

Antworten
7
Aufrufe
2.206
R
K
Antworten
8
Aufrufe
2.706
K
Zurück
Oben