Till: Kreuzabfrage MySQL

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

  1.   
    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?

    1. 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

      1. 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.

        1. 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

          1. 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