Franz Rueh: MATRIX, die 2.

Ich habe im Archiv einen Thread "MATRIX aus Tabellen" gefunden, der meiner Problemlage sehr ähnlich ist. Vinzenz Mai hat das Problem dort super gelöst.
Datenbank = MySQL! Ich habe eine Tabelle mit folgender Struktur:
Spielnummer/SatzNr/Satzergebnis
z.B: A01/1/11:5(mittels concat erstellt)
     A01/2/11:7
     A01/2/11:9
Diese Struktur soll wie in einer Kreuztabelle umgebaut werden zu:
Spielnummer/Satz1/Satzergebnis/Satz2/Satzergebnis/Satz3/Satzergebnis
z.B. A01/Satz1/11:5/Satz2/11:7/Satz3/11:9
Ich habe das mit dem agbewandelten Code von Vinzenz Mai auch hinbekommen, allerdings wird nur das Satzergebnis des 1. Satzes korrekt ausgegeben/angezeigt, bei allen weiteren Sätzen steht "0".

SELECT
  v_e.Spielnummer,
  (case v_e.SatzNr WHEN  1 THEN v_e.Satzergebnis ELSE 0 end) AS Satz1,
   (case v_e.SatzNr WHEN  2 THEN v_e.Satzergebnis ELSE 0 end) AS Satz2,
    (case v_e.SatzNr WHEN  3 THEN v_e.Satzergebnis ELSE 0 end) AS Satz3 FROM
  v_e
GROUP BY
  Spielnummer

Das Ergebnis sieht bei meinem Beispiel dann so aus: A01/Satz1/11:5/Satz2/0/Satz3/0

Was muss am Code gemacht werden, damit auch bei Satz 2 und Satz3 die richtigen Satzergebnisse kommen??

Bitte um Hilfe,
Franz

  1. yo,

    es ist auch immer gut zu wissen, welche version du benutzt, das hat einen gewissen einfluss auf probleme, bzw. lösungen. aber dein problem ist auf den ersten blick ein anderes, nämlich dass du mysql benutzt.

    jedes andere dbms hätte dir bei deiner abfrage eine fehlmeldung ausgegeben, nur mysql geht dort einen anderen weg, ich bezeichne diesen anderen weg gerne als "bug".

    die regel besagt, dass man bei einer gruppierung nur die spalten ausgeben darf, über die gruppiert wurde oder aber die eine aggregat-funktion beinhalten. das ist bei dir aber nicht der fall, weil du mehrere spalten ausgibst, über die du nicht gruppierst oder aggregat-funktionen sind (case spalten). mysql nimmt nun zufällig einen der mehreren möglichen inhalte und gibt eben diesen einen aus.

    das ist dann der augenblick, wo die meisten sich dann wundern, dass die abfrage scheinbar "funktioniert", aber falsche werte angezeigt werden.

    Ilja

    1. Ilja, danke einmal für deine Antwort.
      1. Die MySQL Version, die ich benutze, ist 5.0.
      2. Ich bin, wie meine Anfrage ja zeigt, kein Experte, deine Ausführungen haben mein Verständinis wieder vergrößert. Bei der angesprochenen "Lösung" von Vinzenz Mai im Thread "Matrix" wird in den CASE-Statements die Funktion SUM benützt, aber die ist bei mir nicht möglich. Eine andere mögliche habe ich bisher nicht gefunden.

      Franz

      1. yo,

        Bei der angesprochenen "Lösung" von Vinzenz Mai im Thread "Matrix" wird in den CASE-Statements die Funktion SUM benützt, aber die ist bei mir nicht möglich. Eine andere mögliche habe ich bisher nicht gefunden.

        die sql-abfrage zu erstellen ist das kleinste problem, eigentlich nur eine übersetzung von der information, die man haben will. das eigentlichen probleme liegen darin, erstens ein "sauberes" daten-design zu entwerfen und zweitens sich klar machen, welche daten will ich eigentlich haben.

        und genau daran scheitert es meistens, sich dessen bewusst zu sein. deswegen mein vorschlag, erklär doch noch mal im detail und immer mit beispiel-daten, welche informationen du haben willst. je einfacher und asführlicher erklärt, um so einfacher kann dir hier geholfen werden.

        Ilja

        1. Wie gesagt, es gibt eine Tabelle, in der die Satzergebnisse einer Ballsportart/Faustball stehen. Nach den Normalitätsregeln habe ich die Satzergebnisse vertikal erfasst und nicht horizontal. D.h. die Satzergebnisse stehen jetzt in der View v_e untereinander in den Spalten "Spielnummer", "Satznummer", "Satzergebnis"(= concat der ursprgl. Spalten "ResultatA" und ResultatB")
          Konkret sieht die Datenlage so aus:
          A01/1/11:7(Basistabelle 2 Salten: 11/7)
          A01/2/11:5
          A01/3/11:9
          Übersetzt heißt das: im Spiel mit der Spielnummer A01 ist der 1. Satz 11:7 für Mannschaft A ausgegangen, der 2. Satz 11:5 für Mannschaft A und der 3. Satz 11:9 für Mannschaft A.

          Mit dieser Tabellen bzw. View_Struktur kann ich die Satzergenisse nur untereinander darstellen, ich möchte sie aber, wie es üblich ist, nebeneinander darstellen. Das heißt, im Bericht sollen dann neben der Spielnummer alle Satzergebnisse stehen: z.B. A01: Satz1: 11:7, Satz2: 11:5, Satz3: 11:9

          Ich hoffe, dadurch mehr Klarheit geschaffen zu haben.

          Franz

          1. yo,

            Ich hoffe, dadurch mehr Klarheit geschaffen zu haben.

            wie gesagt, du gruppierst über die spielnummer, insofern müssen alle anderen spalten eine aggregat-funktion enthalten. und die aggregat-funktion, die du suchst, heisst GROUP_CONCAT. einfach mal in die mysql doku unter diesem begriff suchen und wenn weitere fragen dazu auftauchen, hier wieder posten.

            Ilja

            1. Ilja, dein Hinweis auf GROUP_CANCAT ist Goldes wert - die Abfrage liefert das gewünschte Ergebnis!
              Allerdings gibt es noch ein kleines Formatproblem: Die Satzergebnisse werden in dieser Form angezeigt: z.B. 11  : 8,0,0(= 11:8) oder 0,0,0,0,11:7(=11:7). Was ist das für ein Format bzw. wie kann ich das Format beeinflussen/definieren? Das Ausgangsformat in der Basistabelle ist für diese Wert SMALLINT(5).

              Wenn ich das mit deiner Hilfe auch noch hinbekomme, bin isch restlos begeistert!

              Franz

              1. yo,

                wie sieht den deine abfrage aus, welche werte stehen in welchen spalten und wie soll die ergebnismenge aussehen ? bitte genaue und vollständige angaben.

                Ilja

                1. Hallo, es geht nur um die Werte die in den Satzergebnis-Spalten stehen, also die, die durch Zusammenführung 2er Felder entstanden sind. Die Abfrage sieht jetzt so aus:
                  SELECT
                    v_e.Spielnummer,
                    GROUP_CONCAT(case v_e.SatzNr WHEN  1 THEN v_e.Satzergebnis ELSE 0 end) AS Satz1,
                     GROUP_CONCAT(case v_e.SatzNr WHEN  2 THEN v_e.Satzergebnis ELSE 0 end) AS Satz2,
                      GROUP_CONCAT(case v_e.SatzNr WHEN  3 THEN v_e.Satzergebnis ELSE 0 end) AS Satz3
                  FROM
                    v_e
                  GROUP BY
                    Spielnummer

                  Manchmal steht 11:8,000 statt 11:8, ein anderes Mal 0,0,0,0,11:5 statt 11:5. Es gibt kein einziges Satzergebnis das richtig, d.h. ganzzahlig ist.

                  Franz

                  1. yo,

                    ich sehe keinen grund, warum du die fallunterscheidung mit der case anweisung machst. hast du dir die doku und die verwendung von group_concat angeschaut ?

                    ansonsten kann ich mich nur wiederholen, die informaionen, die ich brauche, um die abfrage zu erstellen.

                    • aufbau der tabellen
                    • inhalte der tabellen
                    • gewünschte ergebnismenge

                    Ilja

                    1. Ilja, vielen Dank! Das mit dem Weglassen der CASE-Anweisung ist des Rärsels Lösung - daran habe ich gar nicht gedacht, das "aufzugeben".

                      Danke für deine kompetente Hilfe,
                      Franz