MATRIX, die 2.
Franz Rueh
- datenbank
0 Ilja0 Franz Rueh0 Ilja0 Franz Rueh0 Ilja0 Franz Rueh0 Ilja0 Franz Rueh0 Ilja
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
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
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
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
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
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
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
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
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
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.
Ilja
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