MySQL rows to columns

Split1989

hh-student.de
ID: 238425
L
9 April 2007
1.223
85
Moin

brauche mal wieder hilfe.
habe folgende view


produkt_id|produkt|wert|art|einheit
1| Surface Book | 1 | i7 Prozessor | Stk
1 | Surface Book | 16 | RAM | GB
1 | Surface Book | 512 | SSD | GB
2 | HP ProDesk 400 G2 MT J4B19EA | 4 | Prozessorkerne | Stk
2 | HP ProDesk 400 G2 MT J4B19EA | 1 | RJ45 Port | Stk

output hätte ich gerne

produkt_id| produkt | i7 Prozessor | RAM | SSD | Prozessorkerne | RJ45 Port
1| Surface Book | 1 Stk | 16 GB | 512 GB | NULL | NULL
2| HP ProDesk 400 G2 MT J4B19EA | NULL | NULL | NULL | 4 Stk | 1 Stk

kann man das irgendwie intelligent lösen?
 
Abgesehen davon, dass man das mit MySQL *irgendwie* schon machen *könnte*...

WARUM will man so etwas auf Datenbankebene machen!?


Hole die die Daten aus der Datenbank mit einer Programmiersprache deiner Wahl und gruppiere sie!
 
Wenn die Anzahl der "Spalten" fix ist, ist das mit MySQL kein Problem. Dafür is die Datenbank ja da, dass sie dir die Spalten zuordnet.
Allerdings hast du bereits mit produkt_id und produkt gegen die 2NF verstoßen, weswegen du jetzt ein Problem hast :p

Ist die Anzahl der Spalten nicht fix, so solltest du das besser einfach bei der Ausgabe selber zuordnen, wie thrown-out schon geschrieben hat.

edit Ergänzung:
Dass MySQL dir die Spalten macht, bedingt natürlich, dass die "art" ein sinnvoller Spaltenbezeichner ist. Du willst nicht das Chaos haben und Nutzerwerte (auch wenn sie nur von dir selber sind) als Spaltenbezeichner haben.
art sollte also auch nur ein Fremdschlüssel in einer weitere Tabelle sein.
 
Einfache Lösung für exakt diesen Fall
Code:
SELECT 
 `produkt_id`, 
 `produkt`, 
 IF(`art` = "i7 Prozessor", CONCAT(`wert, ' ', `einheit`)) AS "i7 Prozessor",
 IF(`art` = "RAM", CONCAT(`wert, ' ', `einheit`)) AS "RAM",
 IF(`art` = "SSD", CONCAT(`wert, ' ', `einheit`)) AS "SSD",
 IF(`art` = "Prozessorkerne", CONCAT(`wert, ' ', `einheit`)) AS "Prozessorkerne",
 IF(`art` = "RJ45 Port", CONCAT(`wert, ' ', `einheit`)) AS "RJ45 Port",
FROM produkt


Ansonsten musst du mit prepared statements arbeiten


Code:
set @pivotsql = NULL;
SELECT GROUP_CONCAT(DISTINCT
  CONCAT(
    'MAX(IF(art= ''',
    art,
    ''', art, NULL)) AS ',
    art)
  INTO @pivotsql
FROM produkt;

set @pivotsql = CONCAT(
  'SELECT produkt_id, produkt', 
  @pivotsql, 
  'FROM produkt'
);
PREPARE pivot_stmt FROM @pivotsql;
EXECUTE pivot_stmt;
DEALLOCATE PREPARE pivot_stmt;