MySQL Spalten in Zeilen transformieren

Lesezeit ca. 4 Min.

In diesem Artikel beschreibe ich, wie man in MySQL Spalten in Zeilen transformieren kann.

In manchen Anwendungsfällen befinden sich in einer Datenbanktabelle mehrere Spalten mit Informationen, die in einer Abfrage als Zeilen untereinander dargestellt werden sollen. Konkret stelle ich in diesem Artikel eine Tabelle vor, in welche die Ergebnisse einer Minigolf Spielrunde mit 18 Bahnen abgelegt sind. In einer Abfrage zu statistischen Zwecken werden die Punkte der 18 Bahnen untereinander in 18 Zeilen abgebildet.

Hier zunächst die Struktur der Tabelle:

Minigolf Tabelle

Die Tabelle enthält als Spalten einen eindeutigen Schlüssel (id), eine Spieler ID, ein Datum und 18 Spalten für jeweils eine Bahn auf der Minigolfanlage. Für jede Spielrunde wird ein Datensatz angelegt.

Für eine statistische Auswertung der Spielergebnisse wird folgendes Format benötigt:

Minigolf Auswertung

Wie müsste nun eine SQL Abfrage aussehen, um von der oben gezeigten Tabelle zu der darunterliegenden Auswertung zu gelangen?

Die Tabelle heißt im vorliegenden Fall “spielrunde”. Um zu der gewünschten Auswertung zu gelangen, muß man sich der Lösung schrittweise nähern. Zunächst werden die gewünschten Daten für jede einzelne Bahn mit der folgenden SQL Abfrage erzeugt:


SELECT COUNT(*) as spiele, SUM(bahn1) as points, AVG(bahn1) as average, 'Bahn 1' as bahn
FROM `spielrunde`;

Mit dieser Abfrage erhalten wir für die Bahn 1 die Anzahl der aufgezeichneten Spiele [COUNT(*)], die Summe aller gespielten Punkte [SUM(bahn1)], den Durchschnitt der gespielten Punkte [(AVG(bahn1)] und einen beschreibenden Text aus dem hervorgeht, dass die Daten zur Bahn 1 gehören [‘Bahn 1’ as bahn]. Wir haben nun die Daten für die erste Bahn erhalten. Da wir diese Daten für alle 18 Bahnen brauchen, erstellen wir diese Abfrage jeweils für jede der 18 Bahnen und verknüpfen diese 18 Abfragen mit UNION ALL. Dies sieht dann so aus:


SELECT COUNT(*) as spiele, SUM(bahn1) as points, AVG(bahn1) as average, 'Bahn 1' as bahn
FROM `spielrunde`
UNION ALL
SELECT COUNT(*) as spiele, SUM(bahn2) as points, AVG(bahn2) as average, 'Bahn 2' as bahn
FROM `spielrunde`
UNION ALL
SELECT COUNT(*) as spiele, SUM(bahn3) as points, AVG(bahn3) as average, 'Bahn 3' as bahn
FROM `spielrunde`
UNION ALL
SELECT COUNT(*) as spiele, SUM(bahn4) as points, AVG(bahn4) as average, 'Bahn 4' as bahn
FROM `spielrunde`
UNION ALL
SELECT COUNT(*) as spiele, SUM(bahn5) as points, AVG(bahn5) as average, 'Bahn 5' as bahn
FROM `spielrunde`
UNION ALL
SELECT COUNT(*) as spiele, SUM(bahn6) as points, AVG(bahn6) as average, 'Bahn 6' as bahn
FROM `spielrunde`
UNION ALL
SELECT COUNT(*) as spiele, SUM(bahn7) as points, AVG(bahn7) as average, 'Bahn 7' as bahn
FROM `spielrunde`
UNION ALL
SELECT COUNT(*) as spiele, SUM(bahn8) as points, AVG(bahn8) as average, 'Bahn 8' as bahn
FROM `spielrunde`
UNION ALL
SELECT COUNT(*) as spiele, SUM(bahn9) as points, AVG(bahn9) as average, 'Bahn 9' as bahn
FROM `spielrunde`
UNION ALL
SELECT COUNT(*) as spiele, SUM(bahn10) as points, AVG(bahn10) as average, 'Bahn 10' as bahn
FROM `spielrunde`
UNION ALL
SELECT COUNT(*) as spiele, SUM(bahn11) as points, AVG(bahn11) as average, 'Bahn 11' as bahn
FROM `spielrunde`
UNION ALL
SELECT COUNT(*) as spiele, SUM(bahn12) as points, AVG(bahn12) as average, 'Bahn 12' as bahn
FROM `spielrunde`
UNION ALL
SELECT COUNT(*) as spiele, SUM(bahn13) as points, AVG(bahn13) as average, 'Bahn 13' as bahn
FROM `spielrunde`
UNION ALL
SELECT COUNT(*) as spiele, SUM(bahn14) as points, AVG(bahn14) as average, 'Bahn 14' as bahn
FROM `spielrunde`
UNION ALL
SELECT COUNT(*) as spiele, SUM(bahn15) as points, AVG(bahn15) as average, 'Bahn 15' as bahn
FROM `spielrunde`
UNION ALL
SELECT COUNT(*) as spiele, SUM(bahn16) as points, AVG(bahn16) as average, 'Bahn 16' as bahn
FROM `spielrunde`
UNION ALL
SELECT COUNT(*) as spiele, SUM(bahn17) as points, AVG(bahn17) as average, 'Bahn 17' as bahn
FROM `spielrunde`
UNION ALL
SELECT COUNT(*) as spiele, SUM(bahn18) as points, AVG(bahn18) as average, 'Bahn 18' as bahn
FROM `spielrunde`;

Führen wir diese mehrfache UNION Abfrage aus, dann erhalten wir dieses Ergebnis:

Minigolf Ergebnisse

Nun haben wir genau die Daten, die für die Statistik benötigt werden. In der obigen Ansicht waren nur die Spalten etwas anders angeordnet. Man könnte natürlich schon in der Abfrage die Spalte “bahn” nach vorne setzen. Aber das spielt für die weitere Verarbeitung keine Rolle.

Jedenfalls haben wir gesehen, wie man mit einer SQL Abfrage, die durch UNION ALL Verknüpfung für alle Bahnen wiederholt wurde, in MySQL Spalten in Zeilen transformieren kann.

Ähnliche Artikel:

Fragen oder Feedback zu diesem Artikel

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert