Forum: PC-Programmierung SQL Abfrage -> Häufigkeit einer Spalte mit 0 / NULL


von Wayne I. (mustang)


Lesenswert?

Hallo zusammen,

ich habe folgendes Problem:

Ich habe 2 Tabellen die wie folgt aufgebaut sind:

Tabelle 1: = Personal

ID | Name  |  Vorname
1    Maier    Fritz
2    Müller   Hans
3    Huber    Sebastian
4    Eder     Helmut

Tabelle 2: = Produkt

Produkt | Personal.ID | Qualität
159          1             3
258          1             3
596          2             4
597          2             5
789          4             3

Jetzt möcht ich zählen, wie oft eine Person ein Produkt mit der Qualität 
3 produziert hat. Dafür soll auch eine 0 ausgegeben werden wenn, kein 
Datensatz mit dieser Person vorhanden ist oder eine Person das Produkt 
nicht in der Qualtiät 3 fertigen kann.

Als Ergebnis möchte ich also in diesem Fall das erhalten:
Name | Vorname | Häufigkeit
Maier   Fritz      2
Müller  Hans       0          -> Fertigt nicht in passender Qualität
Huber   Sebastian  0          -> kein Datensatz vorhanden
Eder    Helmut     1

Meine Abfrage sieht bisher so aus:
SELECT Personal.Name, Personal.Vorname, COUNT(Produkt.PersonalID)
FROM Personal
LEFT OUTER JOIN Produkt ON Personal.ID = Produkt.PersonalID
WHERE Produkt.Qualität = 3 OR Produkt.Qualität IS NULL
GROUP BY Personal.Name, Personal.Vorname
ORDER BY Personal.Name

Somit werden zwar alle vorhandenen Datensätze richtig gezählt, Datesätze 
die nicht vorhanden sind werden auch mit 0 angezeigt, jedoch werden 
Datensätze wo die Qualität != 3 ist nicht mit der 0 ausgegeben sondern 
werden gar nicht berücksichtigt.

Wie muss ich meine Abfrage ändern um das zu realisieren?

Danke für eure Hilfe!

von __tom (Gast)


Lesenswert?

Wayne Interessierts schrieb:
>
> Somit werden zwar alle vorhandenen Datensätze richtig gezählt, Datesätze
> die nicht vorhanden sind werden auch mit 0 angezeigt, jedoch werden
> Datensätze wo die Qualität != 3 ist nicht mit der 0 ausgegeben sondern
> werden gar nicht berücksichtigt.


ist auch richtig, genau das verlangst du im query ja auch:

> WHERE Produkt.Qualität = 3 OR Produkt.Qualität IS NULL

von Wayne I. (mustang)


Lesenswert?

Aber ich komm leider nicht drauf, wie ich es ändern könnte, dass es zu 
meinene Anforderungen passt.

Hast du eine Idee?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Wayne Interessierts schrieb:
> Aber ich komm leider nicht drauf, wie ich es ändern könnte, dass es zu
> meinene Anforderungen passt.
Wenn Subquerys unterstützt werden könnte man das z.B. so machen:
1
SELECT Personal.Name, Personal.Vorname, (SELECT count(*) From Produkt where Produkt.PersonalID= Personal.ID AND Produkt.Qualität = 3) as Anzahl
2
FROM Personal
3
GROUP BY Personal.Name, Personal.Vorname
4
ORDER BY Personal.Name

von Peter II (Gast)


Lesenswert?

sollte es nicht ohne das or gehen

SELECT Personal.Name, Personal.Vorname, COUNT(Produkt.PersonalID)
FROM Personal
LEFT OUTER JOIN Produkt ON Personal.ID = Produkt.PersonalID
WHERE Produkt.Qualität = 3
GROUP BY Personal.Name, Personal.Vorname
ORDER BY Personal.Name

von Peter II (Gast)


Lesenswert?

achne 2.Versuch


SELECT Personal.Name, Personal.Vorname, COUNT(Produkt.PersonalID)
FROM Personal
LEFT OUTER JOIN Produkt
   ON Personal.ID = Produkt.PersonalID
   and Produkt.Qualität = 3
GROUP BY Personal.Name, Personal.Vorname
ORDER BY Personal.Name

von Wayne I. (mustang)


Lesenswert?

Hallo,
habe gerade mal deinen Vorschlag probiert. Ich erhalte dabei eine 
Fehlermeldung, dass der Verknüfungsausdruck nicht unterstützt wird. Muss 
wohl an dieser Zeile leigen.

Peter II schrieb:

> LEFT OUTER JOIN Produkt
>    ON Personal.ID = Produkt.PersonalID
>    and Produkt.Qualität = 3


Weiterhin funktioniert diese Variante auch nicht:

> SELECT Personal.Name, Personal.Vorname, (SELECT count(*) From Produkt
> where Produkt.PersonalID= Personal.ID AND Produkt.Qualität = 3) as Anzahl
> FROM Personal
> GROUP BY Personal.Name, Personal.Vorname
> ORDER BY Personal.Name

In der SELECT count(*) fehlt ihm einige Verweise.

Ändere ich das ganze so:
(SELECT count(Produkt.PersonalID) FROM Produkt, Personal WHERE 
Produkt.PersonalID = Personal.ID AND Produkt.Qualität = 3 GROUP BY 
Produkt.PersonalID)

Erhalte ich als Ergebnis die Anzahl aller Datensätze und das für jede 
Person.

Langsam bin ich echt am verzweifeln.
Hat jemand noch eine Idee?

von Peter II (Gast)


Lesenswert?

Wayne Interessierts schrieb:
>> LEFT OUTER JOIN Produkt
>>    ON Personal.ID = Produkt.PersonalID
>>    and Produkt.Qualität = 3

dass ist aber auf jeden Fall gültiges SQL. Das muss gehen, eine 
verknüpfung kann auch über mehre spalten erfolgen.

Was ist es überhaupt für eine Datenbank?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.