Impressum   

"gekippte" Ausgabe von Werten

Problembeschreibung

Datenmodell Jetzt hat man sich die Mühe gemacht und sein Datenmodell (halbwegs) normalisiert und dann kann man seine Werte nicht mehr nebeneinander schreiben?
Statt dem select e.name,w.inhalt,i.wert
  from element e,
       information i,
       wert w
 where e.id=i.element_id
   and w.id=i.wert_id
mit dem Ergebnis

NameInformationWert
GeorgGeburtstag23.07.
GeorgKreisWES
UrsulaKreisDN
AnnaGeburstag05.03.
hätte man gern das Ergebnis "gekippt" (Fachbegriff transponiert).
NameGeburtstagKreis
Georg23.07.WES
Ursula DN
Anna05.03. 

 

Lösungsansatz

Es gibt zwei Strategien dieses Problem zu lösen.

Variante 1

Variante 1 erzeugt erste eine temporäre Tabelle, in dem die einzelnen Werte in die "richtige" Spalte selektiert werden und gruppiert dann über den Namen den maximalen Wert der Informationen.

SELECT name, max(wert1) as "Geburtstag", max(wert2) as "Kreis"
  FROM (
        SELECT a.name as name, b.wert as wert1, '' as wert2
          FROM element a, information b
         WHERE b.Element_id=a.id
           AND b.wert_id=1
         UNION
        SELECT a.name, '', b.wert
          FROM element a, information b
         WHERE b.Element_id=a.id
           AND b.wert_id=2
      ) c
  GROUP BY name
;

Variante 2

Variante 2 macht einen direkten LEFT-Join für alle gewünschten wert_id -Ausprägungen jeweils über die Tabellen information und wert.
Bei vielen wert_id-Auspägungen kann die Datenbank dabei schonmal ins Schwitzen geraten.

SELECT a.name as name, b.wert as "Geburtstag", c.wert as "Kreis"
  FROM element a
  LEFT JOIN information b
    ON (b.Element_id = a.id AND b.wert_id=1)
  LEFT JOIN information c
    ON (c.Element_id = a.id AND c.wert_id=2)
;

Hinweis

In beiden Varianten sollte auf jeden Fall sichergestellt sein, dass pro wert_id und element_id nur ein Wert existiert. ALTER TABLE information
  ADD PRIMARY KEY (element_id,wert_id) ;

Für eine dynamische Variante mit einer beliebigen (genauer nicht festen) Anzahl von wert_id-Ausprägungen würde ich persönlich ein PHP-Script (z.B.) bevorzugen, dass das SQL-Statement der Variante 1 erzeugt und die auch die entsprechende HTML-Tabelle erzeugt.

Kommentare und Anregungen werden gerne angenommen.