# MySQL: Kreuztabellenabfrage



## jeipack (18. März 2009)

Hi
Ich sitze nun schon mehrere Stunden an einer Abfrage und bin mir immer noch nicht sicher ob das so ihrgendwie geht.
Wer Kreuztabellenabfragen aus Access kennt weiss ja schon worauf ich hinaus will. Aber um es nochmals zu verdeutlichen eine vereinfachte Darstellung:
Ich habe folgende werte in einer Datenbank:

```
id	value
--	-------
1	AA
1	AA
1	AB
1	BA
2	AA
2	AB
2	BA
2	BA
2	BB
```
Als Resultat will ich:

```
id	AA	AB	BA	BB
--	----	----	-----	----
1	2	1	1	0
2	1	1	2	1
```
(Hoffe es sieht bei euch einigermasen Formatiert aus)

Ich will also die einzelnen Values als Felder und der Inhalt soll die Anzahl des entsprechenden Value sein.
Nach allem was ich weiss und jetzt auch gelesen habe ist sowas bei MySQL nicht möglich. Allerdings brauche ich es auch eher als "Fake". Schlussendlich wird die Abfrage nämlich mit dem QueryBrowser als csv File exportiert.
Das csv-File muss dann in etwa so aussehen:

```
"id";"Code1";"Code2";"CodeN";\r\n
1;2;1;1;0;\r\n
2;1;1;2;1;\r\n
```
Die Formatierung (also das Semikolon, den Zeilenumbruch) kann ich auch in der Abfrage setzen. Auch kann ich mit InnerSelects und dergleichen arbeiten. Es ist egal wenn die Abfrage nachher 30sec braucht. Hauptsache ist, jemand kann sie ohne Anpassungen ausführen -> als csv exportieren und in Excel aufmachen so dass es so aussieht wie oben.

Meine Ansätze haben bis jetzt alle fehlgeschlagen, freue mich also schon auf eure Ansätze.
Hoffe hier schwirren ein paar SQL-Cracks rum die mir hier helfen können!

Gruss 
jeipack


----------



## kuddeldaddeldu (18. März 2009)

Hi,


```
SELECT id,
   SUM(IF(value = 'AA', 1, 0)) AS AA,
   SUM(IF(value = 'AB', 1, 0)) AS AB,
   SUM(IF(value = 'BA', 1, 0)) AS BA,
   SUM(IF(value = 'BB', 1, 0)) AS BB
   GROUP BY id
```

übrigens spuckt  bei "MySQL Kreuztabellen" jede Menge hilfreiche Treffer aus...

LG


----------



## jeipack (19. März 2009)

Hi
Danke erstmal. Und ja ich hab gegooglet und hab diese Variante auch schon gesehen. Hätte vielleicht erwähnen sollen, dass die Values nicht fest vorgegeben sind, es können also durchaus mehr vorkommen. Somit klappt das mit den IFs nicht mehr, weil ich ja erst zur Laufzeit weiss wie viele Unterschiedliche Values vorkommen.
Für wirklich jeden möglichen Value ein "IF-Feld" einbauen ist auch keine Option. Denn es sind ein paar Hundert verschiedene Values, bei einer Abfrage werden aber nur so ca 20 verschiedene raus kommen. Somit hätte ich eine riesen Liste bei der über 90% leer ist. 

Gestern im Bett dachte ich ich habe die Lösung. Schlussendlich würde es auf einige SubSelects hinaus laufen und das Resultat wäre in nur einem Feld, aber mit allen Infos schön mit Semikolon und Umbrüchen formatiert.

Allerdings stelle ich mir den Aufwand ein kleines JavaProgramm mit einem Knopf (Abfrage starten) dafür zu erstellen und in diesem die Daten um zu strukturieren einfacher vor 


Also Danke nochmals, aber so einfach ists leider nicht ^^
Gruss
jeipack

Edit: Ahja weitere Suchbegriffe wären "MySQL Pivot", "MySQL transform". Ich hab aber noch nichts gefunden bei dem es wirklich dynamisch und ohne FrontEnd funktioniert.


----------



## kuddeldaddeldu (19. März 2009)

Hi,



jeipack hat gesagt.:


> Hi
> Danke erstmal. Und ja ich hab gegooglet und hab diese Variante auch schon gesehen. Hätte vielleicht erwähnen sollen, dass die Values nicht fest vorgegeben sind, es können also durchaus mehr vorkommen. Somit klappt das mit den IFs nicht mehr, weil ich ja erst zur Laufzeit weiss wie viele Unterschiedliche Values vorkommen.
> Für wirklich jeden möglichen Value ein "IF-Feld" einbauen ist auch keine Option. Denn es sind ein paar Hundert verschiedene Values, bei einer Abfrage werden aber nur so ca 20 verschiedene raus kommen. Somit hätte ich eine riesen Liste bei der über 90% leer ist.



Dann frage vorher per


```
SELECT DISTINCT value FROM tabelle
```

ab, welche Werte in der Tabelle vorhanden sind und baue die Abfrage aus dem Ergebnis z.B. mittels PHP dynamisch zusammen.

LG


----------



## jeipack (19. März 2009)

Ich suchte aber doch eine Lösung ohne FrontEnd. Also direkt im QueryBrowser (wie oben auch steht  )

Habe es aber aus Zeitmangel doch schnell mit einem kleinen Javatool realisiert:
- Connectiondetails eingeben
- Daten abfragen und umstruktieren
- CSV File ausgeben.


Greez


----------

