Zum Inhalt springen

Count auf mehrere verknüpte Tabellen


Flitz

Empfohlene Beiträge

Hallo, ich habe mal wieder ein SQL Problem.

Zur verdeutlichung poste ich mal einen Teil meines Datenbankmodels:

erm.jpg

Und zwar möchte ich in auf meine Access DB (Version 2003) eine Query machen die mir die wirklichen Einsätze jeden Spielers einer bestimmten Mannschaft zur aktuellen Saison zeigt.

Das heißt ich brauche eine Summierung über die Startformation (tbl_Startelf) sowie über die Einwechslungen (tbl_BegegnungAuswechslungen).

Es war kein Problem diese Abfragen sperrat hin zu bekommen also z.B. wie oft stand welcher Spieler in der Startelf:


SELECT tbl_Spielerkader.name, tbl_Spielerkader.vorname, COUNT(tbl_Startelf.spielerId) AS Einsätze

FROM tbl_Saison INNER JOIN (tbl_Begegnungen INNER JOIN (tbl_Startelf INNER JOIN tbl_Spielerkader ON tbl_Startelf.spielerId=tbl_Spielerkader.spielerId) ON tbl_Startelf.begegnungId=tbl_Begegnungen.begegnungId) ON tbl_Saison.saisonId=tbl_Begegnungen.saison

WHERE tbl_Saison.default=True AND tbl_Begegnungen.heimmannschaft=1

GROUP BY tbl_Startelf.spielerId, tbl_Spielerkader.name, tbl_Spielerkader.vorname

ORDER BY COUNT(tbl_Startelf.spielerId) DESC , tbl_Spielerkader.name, tbl_Spielerkader.vorname;

Oder z.B. wie oft wurde welcher Spieler eingewechsel:

SELECT tbl_Spielerkader.name, tbl_Spielerkader.vorname, COUNT(tbl_BegegnungAuswechslungen.eingewechselterSpieler) AS Einwechslungen

FROM tbl_Saison INNER JOIN (tbl_Begegnungen INNER JOIN (tbl_BegegnungAuswechslungen INNER JOIN tbl_Spielerkader ON tbl_BegegnungAuswechslungen.eingewechselterSpieler=tbl_Spielerkader.spielerId) ON tbl_Begegnungen.begegnungId = tbl_BegegnungAuswechslungen.begegnungId) ON tbl_Saison.saisonId=tbl_Begegnungen.saison

WHERE tbl_Saison.default=True AND tbl_Begegnungen.heimmannschaft=1

GROUP BY tbl_BegegnungAuswechslungen.eingewechselterSpieler, tbl_Spielerkader.name, tbl_Spielerkader.vorname

ORDER BY COUNT(tbl_BegegnungAuswechslungen.eingewechselterSpieler) DESC , tbl_Spielerkader.name, tbl_Spielerkader.vorname;

Was ich nun benötige ist die Summe dieser beiden Abfragen in einer, da ja auch eine Einwechslung ein Einsatz ist.

Leider habe ich keine Ahnung wie ich diese 2 Abfragen zu einer verbinden kann / muss bzw. wie meine richtige Abfrage aussehen müsste.

Ich scheitere irgendwie immer an dem INNER JOIN, da ich durch die verschiedenen Kriterien Probleme bekomme die Tabelle zu verknüpfen.

Weiß einer von Euch wie eine solche Abfrage aussehen muss??

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mein Vorschlag, wenn die beiden Selects oben bereits die richtigen Werte liefer und du die nur summieren willst:

Erstell einen View(Sicht) mit genau diesen Selects und verknüpf die durch einen Union select. Hierbei is Voraussetzung, dass alle selektierten Spalten den selben Datentyp haben. Schaut bei dir ja ganz ok aus.

Wenn du diesen View hast, machst du auf diesen eine Abfrage, in der die beiden Werte summiert werden.

So könnte es meiner Meinung nach funktionieren.

Ich weiß leider nur nicht, ob das mit dem Union so reibungslos unter Access funktioniert.

Probier es doch einfach aus.

Ich hoffe ich hab dein Problem richtig verstanden :D

mfg

Schmarrer

Link zu diesem Kommentar
Auf anderen Seiten teilen

ah ok, wenn man das UNIOn so auch anwenden kann würde es gehen.

Wenn ich richtig liege sollte meine Query nun so aussehen:


SELECT tbl_Spielerkader.name, tbl_Spielerkader.vorname, COUNT(tbl_Spielerkader.spielerId)

FROM [SELECT tbl_Spielerkader.name, tbl_Spielerkader.vorname, COUNT(tbl_BegegnungAuswechslungen.eingewechselterSpieler) AS Einwechslungen

FROM tbl_Saison INNER JOIN (tbl_Begegnungen INNER JOIN (tbl_BegegnungAuswechslungen INNER JOIN tbl_Spielerkader ON tbl_BegegnungAuswechslungen.eingewechselterSpieler=tbl_Spielerkader.spielerId) ON tbl_Begegnungen.begegnungId=tbl_BegegnungAuswechslungen.begegnungId) ON tbl_Saison.saisonId=tbl_Begegnungen.saison

UNION

SELECT tbl_Spielerkader.name, tbl_Spielerkader.vorname, COUNT(tbl_Startelf.spielerId) AS Einsätze

FROM tbl_Saison INNER JOIN (tbl_Begegnungen INNER JOIN (tbl_Startelf INNER JOIN tbl_Spielerkader ON tbl_Startelf.spielerId=tbl_Spielerkader.spielerId) ON tbl_Startelf.begegnungId=tbl_Begegnungen.begegnungId) ON tbl_Saison.saisonId=tbl_Begegnungen.saison]. AS [%$##@_Alias]

WHERE tbl_Saison.default=True AND tbl_Begegnungen.heimmannschaft=1

GROUP BY tbl_Spielerkader.spielerId, tbl_Spielerkader.name, tbl_Spielerkader.vorname

ORDER BY COUNT(tbl_Spielerkader.spielerId) DESC , tbl_Spielerkader.name, tbl_Spielerkader.vorname;

Leider bekomme ich folgenden Fehler:

"Sie wollten eine Abfrage ausführen, die den angegebenen Ausdruck 'name' nicht als Teil der Aggregationsfunktion einschließt".

Muss ich den Aliaas den mir Access nun für meine verschachteltete SELECt Anweisung in den GROUP BY mit aufnehmen oder woran liegt dieser Fehler?

Danke für eure Hilfe

Link zu diesem Kommentar
Auf anderen Seiten teilen

Benutz die Abfrage als Subselect (als ob es eine eigene Tabelle wäre) und joine erst dann die zusätzlichen Informationen wie Spielername dazu

[...] FROM spielerkader sk JOIN

(

SELECT spieler_id, count(spieler) from

(SELECT spieler_id from startelf

UNION ALL

SELECT eingewechselterSpieler from auswechslung) a

GROUP BY spieler_id

) sub

ON sk.spieler_id=sub.spieler_id

[...]

das macht die ganze Abfrage viel Übersichtlicher und du brauchst kein großes GROUP BY mehr

Link zu diesem Kommentar
Auf anderen Seiten teilen

sorry aber das kappier ich grad nicht!

Was soll ich genau mit den UNION verknüpfen? Die zwei COUNTS?

Müssen diese zwei Selects die ich in mein FROM mit einbaue dann komplett eigenständige Selects sein?

Wie löse ich das mit den ganzen Joins zwischen den Tabellen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Schrittweise:

SELECT spieler_id from startelf

UNION ALL

SELECT eingewechselterSpieler from auswechslung

erzeugt eine 1-Spaltige Tabelle mit allen Spielereinsätzen oder Einwechslungen

SELECT spieler_id, count(spieler) from

( <UNION von oben> ) a

GROUP BY spieler_id

erzeugt aus der 1-Spaltigen Tabelle eine 2-Spaltige mit

Spieler_id Anzahl(Spieler_id)

[...] FROM spielerkader sk JOIN

(

< GROUP BY von oben >

) sub

ON sk.spieler_id=sub.spieler_id

[...]

hier kann man das 2. "Subselect" wie eine Tabelle verwenden um sie mit anderen Tabellen zu joinen, z.B. mit der Tabelle Spielerkader um den Namen zu der Anzahl zu bekommen

Schau mal unter SQL und Subselect nach, da dürftest du genauere Erklärungen dazu finden

Link zu diesem Kommentar
Auf anderen Seiten teilen

ah ok, so war es schon viel verständlicher! Hat ohne Probleme funktioniert! Vielen Dank!

Für alle die es interessiert, hier meine Lösung

SELECT tbl_Spielerkader.name, tbl_Spielerkader.vorname, Count(tempUnion.spielerId) AS EinsätzeFROM

[sELECT tbl_Startelf.spielerId FROM tbl_Startelf INNER JOIN (tbl_Begegnungen INNER JOIN tbl_Saison ON tbl_Begegnungen.saison = tbl_Saison.saisonId) ON tbl_Startelf.begegnungId = tbl_Begegnungen.begegnungId WHERE tbl_Begegnungen.heimmannschaft = 1 AND tbl_Saison.default = True UNION ALL SELECT tbl_BegegnungAuswechslungen.eingewechselterSpieler FROM tbl_BegegnungAuswechslungen INNER JOIN (tbl_Begegnungen INNER JOIN tbl_Saison ON tbl_Begegnungen.saison = tbl_Saison.saisonId) ON tbl_BegegnungAuswechslungen.begegnungId = tbl_Begegnungen.begegnungId WHERE tbl_Begegnungen.heimmannschaft = 1 AND tbl_Saison.default = True

]. AS tempUnion

INNER JOIN tbl_Spielerkader ON tempUnion.spielerId = tbl_Spielerkader.spielerId

GROUP BY tbl_Spielerkader.name, tbl_Spielerkader.vorname, tempUnion.spielerId

ORDER BY Count(tempUnion.spielerId) DESC , tbl_Spielerkader.name, tbl_Spielerkader.vorname;

Ich habe in das Subselect noch meine Bedinungen für die Saison und Mannschaft mit eingebaut!

Nochmals Danke!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...