Anzahl d. Referenzen auf Spalten in anderer Tabelle "zählen"
nilsfad
- datenbank
Hallo
folgendes "Problem":
Ich habe zwei Tabellen, Meldung und Vorgang. Beide mit einer PrimaryKey Id. Darüberhinaus besitzt die Tabelle Meldung noch eine Spalte IdVorgang, mit der genau EINEM Vorgang mehrere Meldungen zugeordnet werden können.
Ich möchte meine SQL Abfrage nun so gestallten, dass mir nicht nur
der Komplette Inhalt der Tabelle Vorgang ausgegegben wird, sondern
dass für jeden Datensatz noch ein extra Feld dabei ist in dem steht,
wie viele Meldungen auf diesen Vorgang zeigen.
Ich habe es versucht mit:
SELECT Vorgang.Beschreibung, COUNT(Meldung.IdMeldung) AS Anzahl FROM Vorgang, Meldung WHERE Vorgang.IdVorgang = Meldung.IdVorgang
Immer erhalte ich jedoch folgenden Fehler:
"Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC Microsoft Access Driver] Sie wollten eine Abfrage ausführen, die den angegebenen Ausdruck 'Beschreibung' nicht als Teil der Aggregatfunktion einschließt." (Arbeite mit MS Access)
Daraufhin habe ich den COUNT-Teil entfernt und gesehen, dass unter Einbeziehung der Tabelle Meldung in die Abfrage auch diejenigen Vorgänge nicht angezeigt werden, auf die garkeine Meldung verweist. Das ist ein weiteres "Problem".
Kennt sich vielleicht ein "Profi" hier mehr aus als ich?
Hi !
SELECT Vorgang.Beschreibung, COUNT(Meldung.IdMeldung) AS Anzahl FROM Vorgang, Meldung WHERE Vorgang.IdVorgang = Meldung.IdVorgang
Wenn Du hinten noch ein "group by Vorgang.Beschreibung" anhängst, müsste es funktionieren.
Gruß
Hans
Nunja, das schafft leider noch keine Abhilfe, denn ich will ja mehr Spalten als nur "Beschreibung" aus der Tabelle vorgang auslesen. Die von dir vorgeschlagene Lösung führt zur nächsten "Fehlermeldung":
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC Microsoft Access Driver] Sie wollten eine Abfrage ausführen, die den angegebenen Ausdruck 'Status' nicht als Teil der Aggregatfunktion einschließt.
Soll ich da jetzt jede einzelne Spalte in einer GROUP BY Klausel anhängen? Was bewirkt das überhaupt?
Wenn Du hinten noch ein "group by Vorgang.Beschreibung" anhängst, müsste es funktionieren.
Gruß
Hans
Hi nilsfad,
also, erstens kann ich nicht riechen, was Du für Spalten holen willst.
zweitens.
Annahme folgende Tabelle
Name Hand Finger
-----------------------------------------
Hans links 1
Hans links 1
Hans links 1
Hans links 1
Hans links 1
Hans rechts 1
Hans rechts 1
Hans rechts 1
Hans rechts 1
Hans rechts 1
Klaus links 1
Klaus links 1
...
Peter rechts 1
Peter rechts 1
Peter rechts 1
So, bei
select count(Finger) from Tabelle ist das Ergebnis 30
Wenn Du nun wissen willst, wieviele Finger jeder hat, mußt Du Name als Bezug für den count angeben
select name, count(finger) from Tabelle group by name. Ergebnis: Hans, Klaus und Peter haben jeweils 10 Finger
Wenn Du wissen willst, an welcher Hand jeder wieviele Finger hat, dann
select name, arm, count(finger) from Tabelle group by name, arm.
Jetzt kommen also zuerst die Namen, dann die Hände und dann die Anzahl der Finger bezogen auf Name und Hand. Jeder hat also 5 Finger an jeder Hand.
Ich hoffe, das group by ist jetzt verständlich.
Gruß
Hans
Ah Danke jetzt wirds etwas klarer. Deinen Anweisungen entsprechend habe ich meine SELECT-Abfrage nun angepasst und damit wird für jeden Vorgang die Anzahl der auf diesen Vorgang referenzierenden Meldungen gezählt.
Ein "Problem" bleibt aber noch, und zwar fehlen jene Vorgänge in der Ergebnismenge, denen keine Meldungen zugeordnet sind. Wie kann man da abhilfe schaffen?
Hi !
Ein "Problem" bleibt aber noch, und zwar fehlen jene Vorgänge in der Ergebnismenge, denen keine Meldungen zugeordnet sind. Wie kann man da abhilfe schaffen?
Wie soll das auch gehen? Du machst eine Abfrage, bei der die Vorgangs-ID in der Meldungen-Tabelle vorkommen soll. Wenn also in der Meldungen-Tabelle keine Vorgangs-ID vorkommt, kann auch kein Ergebnis geliefert werden.
Gruß
Hans