Kreuzabfrage MySQL
Till
- datenbank
0 King^Lully0 Till0 King^Lully0 Till
Hallo in die Runde,
ich habe noch mal eine Frage bezüglich einer Kreuzabfrage, diesmal würde ich das Problem gerne mit MySQL (5.0) lösen (ohne Pearl, & Co. und nicht in Access/Oracle) ...
Hier das Beispiel (ist ein Abfrageergebnis):
Segment Klasse Flaeche
X 3 9
X 5 8
X 7 0.5
X 27 12.5
Y 3 7.5
Y 5 16
Y 7 0.25
Y 27 21.25
Soll umgeschrieben werden in (Fläche als Eintrag in den Spalten der Klassen):
Segment Kl_1 Kl_2 Kl_3 ... Kl_27
X 0 0 9 ... 12.5
Y 0 0 7.5 ... 21.25
Kann mir da jemand weiterhelfen???
Vielen Dank!
Till
SELECT
'X' as Segment,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 1) AND
(Segment = 'X')
) AS Kl_1,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 2) AND
(Segment = 'X')
) AS Kl_2,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 3) AND
(Segment = 'X')
) AS Kl_3,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 4) AND
(Segment = 'X')
) AS Kl_4,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 5) AND
(Segment = 'X')
) AS Kl_5,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 6) AND
(Segment = 'X')
) AS Kl_6,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 7) AND
(Segment = 'X')
) AS Kl_7,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 8) AND
(Segment = 'X')
) AS Kl_8,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 9) AND
(Segment = 'X')
) AS Kl_9,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 10) AND
(Segment = 'X')
) AS Kl_10,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 11) AND
(Segment = 'X')
) AS Kl_11,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 12) AND
(Segment = 'X')
) AS Kl_12,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 13) AND
(Segment = 'X')
) AS Kl_13,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 14) AND
(Segment = 'X')
) AS Kl_14,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 15) AND
(Segment = 'X')
) AS Kl_15,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 16) AND
(Segment = 'X')
) AS Kl_16,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 17) AND
(Segment = 'X')
) AS Kl_17,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 18) AND
(Segment = 'X')
) AS Kl_18,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 19) AND
(Segment = 'X')
) AS Kl_19,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 20) AND
(Segment = 'X')
) AS Kl_20,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 21) AND
(Segment = 'X')
) AS Kl_21,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 22) AND
(Segment = 'X')
) AS Kl_22,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 23) AND
(Segment = 'X')
) AS Kl_23,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 24) AND
(Segment = 'X')
) AS Kl_24,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 25) AND
(Segment = 'X')
) AS Kl_25,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 26) AND
(Segment = 'X')
) AS Kl_26,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 26) AND
(Segment = 'X')
) AS Kl_27
UNION SELECT
'Y' as Segment,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 1) AND
(Segment = 'Y')
) AS Kl_1,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 2) AND
(Segment = 'Y')
) AS Kl_2,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 3) AND
(Segment = 'Y')
) AS Kl_3,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 4) AND
(Segment = 'Y')
) AS Kl_4,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 5) AND
(Segment = 'Y')
) AS Kl_5,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 6) AND
(Segment = 'Y')
) AS Kl_6,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 7) AND
(Segment = 'Y')
) AS Kl_7,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 8) AND
(Segment = 'Y')
) AS Kl_8,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 9) AND
(Segment = 'Y')
) AS Kl_9,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 10) AND
(Segment = 'Y')
) AS Kl_10,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 11) AND
(Segment = 'Y')
) AS Kl_11,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 12) AND
(Segment = 'Y')
) AS Kl_12,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 13) AND
(Segment = 'Y')
) AS Kl_13,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 14) AND
(Segment = 'Y')
) AS Kl_14,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 15) AND
(Segment = 'Y')
) AS Kl_15,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 16) AND
(Segment = 'Y')
) AS Kl_16,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 17) AND
(Segment = 'Y')
) AS Kl_17,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 18) AND
(Segment = 'Y')
) AS Kl_18,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 19) AND
(Segment = 'Y')
) AS Kl_19,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 20) AND
(Segment = 'Y')
) AS Kl_20,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 21) AND
(Segment = 'Y')
) AS Kl_21,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 22) AND
(Segment = 'Y')
) AS Kl_22,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 23) AND
(Segment = 'Y')
) AS Kl_23,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 24) AND
(Segment = 'Y')
) AS Kl_24,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 25) AND
(Segment = 'Y')
) AS Kl_25,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 26) AND
(Segment = 'Y')
) AS Kl_26,
(
SELECT
Sum(Flaeche)
WHERE
(Klasse = 26) AND
(Segment = 'Y')
) AS Kl_27
Sexy, oder?
Hallo King^Lully,
danke für die Antwort - sehr sexy, in der Tat ;)
Aber was ist, wenn es nicht 2 sondern 1000 Segmente gibt ?!? Hätte ich vielleicht erwähnen sollen ...
Die gute Nachricht: Es sind in der Tat "nur" 27 Klassen. Vielleicht kommt man mit bedingten Schleifen weiter? Habe ich in MySQL aber noch nie gemacht ...
Ciao,
Tillmann
Aber was ist, wenn es nicht 2 sondern 1000 Segmente gibt ?!? Hätte ich vielleicht erwähnen sollen ...
Ich habe die Matrizenumformung kodiert. Du solltest natürlich auch die Datenbasis zeigen.
Die gute Nachricht: Es sind in der Tat "nur" 27 Klassen.
Funzt es denn? (Anmerkung: Du müsstest die von mir genannte Abfrage auf die Ergebnismenge der ersten loslassen, Stichaort: Sub-SELECT.)
Vielleicht kommt man mit bedingten Schleifen weiter? Habe ich in MySQL aber noch nie gemacht ...
Du könntst eine stored procedure schreiben, die Verfügbarkeit derselben ist aber von der MySQL-Version abhängig.
Eine einfache Lösung (Du willst ja fortlaufende Klassen, auch wenn keine Daten da sind) sehe ich nicht.
Funzt es denn? (Anmerkung: Du müsstest die von mir genannte Abfrage auf die Ergebnismenge der ersten loslassen, Stichaort: Sub-SELECT.)
Habe ich jetzt ehrlich gesagt nicht ausprobiert (bin inzwischen zu Hause ohne die Daten) - Aber das führt ja auch zu nichts ...
Du könntst eine stored procedure schreiben, die Verfügbarkeit derselben ist aber von der MySQL-Version abhängig.
Wie gesagt, ich habe 5.0 installiert, da gibt es ja procedures. Kenne ich mich aber nicht wirklich gut damit aus.
Eine einfache Lösung (Du willst ja fortlaufende Klassen, auch wenn keine Daten da sind) sehe ich nicht.
Tja, schade ... vielleicht hat jemand sonst eine Idee???
Schönen Abend,
Till
Hallo
Du könntst eine stored procedure schreiben, die Verfügbarkeit derselben ist aber von der MySQL-Version abhängig.
Wie gesagt, ich habe 5.0 installiert, da gibt es ja procedures. Kenne ich mich aber nicht wirklich gut damit aus.
Tja, schade ... vielleicht hat jemand sonst eine Idee???
ich hatte da mal eine (für MS-SQL), vielleicht kannst Du das für MySQL umschreiben.
Freundliche Grüße
Vinzenz