Flitz Geschrieben 11. April 2007 Teilen Geschrieben 11. April 2007 Hallo, ich habe mal wieder ein SQL Problem. Zur verdeutlichung poste ich mal einen Teil meines Datenbankmodels: 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?? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Schmarrer Geschrieben 11. April 2007 Teilen Geschrieben 11. April 2007 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 mfg Schmarrer Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Flitz Geschrieben 12. April 2007 Autor Teilen Geschrieben 12. April 2007 Nein sorry, das würde mir nicht weiter helfen. Kann ich nicht "irgendwie" die zwei SELECT Bereiche verschachteln und die Ergebnise meine 2 Count() addieren/summieren? Weiß da jemand was? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jan Jansen Geschrieben 12. April 2007 Teilen Geschrieben 12. April 2007 Mit Union sollte es unkomplizierter klappen SELECT spieler_id, count(spieler) from (SELECT spieler_id from startelf UNION ALL SELECT eingewechselterSpieler from auswechslung) a GROUP BY spieler_id Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Flitz Geschrieben 12. April 2007 Autor Teilen Geschrieben 12. April 2007 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jan Jansen Geschrieben 12. April 2007 Teilen Geschrieben 12. April 2007 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Flitz Geschrieben 12. April 2007 Autor Teilen Geschrieben 12. April 2007 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jan Jansen Geschrieben 12. April 2007 Teilen Geschrieben 12. April 2007 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Flitz Geschrieben 13. April 2007 Autor Teilen Geschrieben 13. April 2007 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! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.