Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

SUM der besten 4 aber alle anzeigen mit Zähler pro Mannschaft und Teammember

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von eartquake, 30 Januar 2017.

  1. eartquake

    eartquake Neuer Benutzer

    Hallo zusammen,

    leider komme ich bei meinem Problem nicht so ganz weiter.
    Meine Ausbildung wo SQL behandelt wurde ist schon zu lange her und ich hatte nichts mehr damit zu tun.
    Es handelt sich um eine Schützendatenbank.

    Gegeben:
    3 Tabellen:
    Table: Scheiben
    Columns:
    ScheibenID int(11) PK

    Starterliste varchar(36)
    StarterlistenID int(11)
    StartNr int(11)
    Nachname varchar(36)
    Vorname varchar(36)
    SportpassID int(11)
    StandNr smallint(6)
    Disziplin varchar(36)
    DisziplinlID int(11)
    Klasse varchar(36)
    KlassenID int(11)
    Verein varchar(36)
    VereinsID int(11)
    Mannschaft varchar(36)
    MannschaftsID int(11)
    Rangliste varchar(36)
    RanglistenID int(11)
    Trefferzahl smallint(6)
    TotalRing int(11)
    TotalRing01 int(11)
    BesterTeiler01 int(11)
    Zeitstempel datetime

    Table: Serien
    Columns:
    ScheibenID int(11) PK

    Stellung smallint(6) PK
    Serie smallint(6) PK
    Ring int(11)
    Ring01 int(11)

    Table: Treffer
    Columns:
    ScheibenID int(11) PK

    Stellung smallint(6) PK
    Treffer smallint(6) PK
    x int(11)
    y int(11)
    Innenzehner tinyint(1)
    Ring int(11)
    Ring01 int(11)
    Teiler01 int(11)
    Zeitstempel datetime
    Millisekunden smallint(6)
    Table: Treffer
    Columns:
    ScheibenID int(11) PK
    Stellung smallint(6) PK
    Treffer smallint(6) PK
    x int(11)
    y int(11)
    Innenzehner tinyint(1)
    Ring int(11)
    Ring01 int(11)
    Teiler01 int(11)
    Zeitstempel datetime
    Millisekunden smallint(6)

    Ganz Einfach eigentlich.
    Jetzt suche ich die Möglichkeit eine Abfrage zu gestalten die mir folgendes Liefert:
    Für ein Spezielles Schiessen (Starterliste oder Starterliste ID) möchte ich das Ergebniss aller Schützen (Nachname, Vorname usw ) in einer Tabelle erhalten Die nach der Summe TotalRing01 der 4 erstenSchützen sortiert wird.

    Folgendes habe ich schon herausgefunden:
    Alle Schützen nach Mannschaft sortiert.
    1
    Select a_S.*,a_A.*
    FROM SSMDB2.Scheiben as a_S
    /*where Serien.ScheibenID = a_s.ScheibenID*/
    LEFT OUTER JOIN SSMDB2.Serien as a_A
    ON a_A.ScheibenID = a_S.ScheibenID
    WHERE Starterliste = 'Laien Schießen 2016'
    ORDER BY MannschaftsID
    /*GROUP BY MannschaftsID*/
    ;

    Die Summe aller Mannschaftsteilnehmer:
    2
    Select a_S.*,Sum(TotalRing01) AS M_Summe
    FROM SSMDB2.Scheiben as a_S
    /*where Serien.ScheibenID = a_s.ScheibenID*/
    RIGHT OUTER JOIN SSMDB2.Serien as a_A
    ON a_A.ScheibenID = a_S.ScheibenID
    WHERE Starterliste = 'xxx'
    GROUP BY MannschaftsID
    ;

    Das Ergebniss soll alles aus 1 enthalten aber die Summe wie in 2 aber nur für die 4 besten.

    Irgendwie steh ich auf dem Schlauch.

    Gruss Chris





     
  2. eartquake

    eartquake Neuer Benutzer

    DB ist MARIADB 10.0.25 also kein rowcount
     
  3. akretschmer

    akretschmer Datenbank-Guru

    Dein Tabellendesign erscheint optimierungsfähig. Ich sehe eine Menge vom Primary Keys, aber keine Foreign Key Constraints. Dafür sehe ich eine Tabelle, in der Stammdaten UND Bewegungsdaten stehen: Tabelle Scheiben. Ich sehe da auch gleichzeitig ID's für bestimmte Dinge UND Details zu diesen Dingen. Das ist alles Murks.

    Ich sehe syntaktische Fehler, in Deiner zweiten Query hast Du eine Aggregation (sum()), aber nur ein GROUP BY über eine Spalte des Ergebnisses - dieses hat aber eine ganze Menge mehr Spalten. Das ist logisch (!!!) falsch und sollte einen Syntaxfehler ergeben. Sollte. MySQL und alle Mutationen davon liefern aber statt dessen ein irgendwie zufälliges - und damit falsches - Ergebniss. Update auf die neueste MySQL-Version - diese erkennt nun endlich den Fehler. So wie alle anderen Datenbanksysteme dieser Welt auch.

    Zu Deinem Problem: was Du suchst geht ganz einfach mit Window-Funktionen. Die können fast alle Datenbanken dieser Welt - außer MySQL und dessen Mutationen.

    Zusammengefaßt:

    • dein DB-Design ist Murks
    • deine DB belügt Dich mit falschen Ergebnissen
    • für das, was Du brauchst, hast Du die falsche DB

    Der einfachste Weg, Dein Problem zu lösen, ist das alles in den Müll zu werfen und es mit einer richtigen Datenbank neu aufzubauen.
     
  4. eartquake

    eartquake Neuer Benutzer

    Vielen Dank für den Tipp mit Window-Funktionen die gab es glaube ich damals <2000 noch nicht.

    COUNT
    From MariaDB 10.2.0, COUNT() can be used as a window function.

    Zu dieser Datenbank hast du vollkommen Recht.
    Diese DB ist nur eine zusätzliche Datenbank als Schnittstelle zu externen Anwendungen.
    Es scheint mir so vorzukommen also ob diese DB nur einmal nach jedem Wettkampf gefüllt wird und dann mit
    Select * from ..... abgefragt wird. Dann verarbeitet jeder der diese Schnittstelle benutzt diese Daten in Excel und macht dort weiter.
    Die DB stammt nicht von mir.
    Auch kann ich an der DB nichts ändern die ist mir so vorgegeben. ;-(

    So lange ich zu einem Zeitpunkt nach dem Wettkampf die korrekten Daten
    welche ich für einen einmal im Jahr wiederkehrenden Vorgang (Ausdruck von mehreren Listen) die das Original Progamm so nicht bietet bekomme,
    schaue ich mal ob ich trotzdem mit einer window funktion weiterkomme.

    Mal schauen wie ich weiter mache die andere originale DB abzufragen oder vielleicht funktioniert eine window funktion.

    Auch MariaDB habe ich mal aktualisiert. Auch hier kann ich nichts ändern da dieses Fremdprogramm schon existiert.

    Die original DB des Fremdprogramms scheint auf den ersten flüchtigen Blick die erwähnten Fehler nicht zu enthalten.

    Trotzdem nochmal vielen Dank.

    Gruss Chris
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden