Columns in Zeilen umwandeln

catalunya

Neuer Benutzer
Beiträge
1
Hallo zusammen,

ich stehe ihr vor einer Problematik bei welcher ich nicht weiterkomme.

Ich habe eine Datenbank (vom Vorgänger übernommen) welche mehrere Tabellen mit einer gewissen Problematik versehen sind.
Beispiel:
Eine Tabelle hat 5 Columns des Typs bit. Hier werden Maßnahmen gegenüber Kunden behandelt (z. B. IstReparatur, IstKontakt). Jetzt sollen weitere 20 Maßnahmearten hinzukommen. Ich möchte jetzt natürlich nicht weitere 20 Felder anlegen. Ich möchte eine Untertabelle erstellen. In dieser soll dann für jede Maßnahme ein Datensatz erstellt werden. Im Frontend würde sich der Anwender dann einen Eintrag aus einer Nachschlagetabelle auswählen können. Somit könnten dann bei einer späteren Erweiterung die Benutzer selbst die neuen Maßnahmen in der Nachschlagetabelle anlegen können.
Die Frage ist jetzt: Wie gelingt es, die Felder der bereits bestehenden Datensätze der Haupttabelle in einzelne Datensätze der Untertabelle zu schreiben. Ich sitze da schon Tage daran und bekomme es nicht hin.
Wäre für einen Tipp wie man so etwas mittels SQL hinbekommt dankbar.

Vielen Dank für eure Mühe im Voraus.
 
Werbung:
Du hast:

Code:
postgres=# select * from catalunya ;
 id | is_reparatur | is_kontakt | is_bunt 
----+--------------+------------+---------
  1 | t            | f          | t
  2 | f            | f          | t
  3 | t            | t          | f
(3 rows)

und suchst

Code:
postgres=# select id, 'is_reparatur' as flag from catalunya where is_reparatur union all select id, 'is_kontakt' from catalunya where is_kontakt union all select id, 'is_bunt' from catalunya where is_bunt order by id, flag;
 id |     flag     
----+--------------
  1 | is_bunt
  1 | is_reparatur
  2 | is_bunt
  3 | is_kontakt
  3 | is_reparatur
(5 rows)

postgres=#
 
Werbung:
In Postgres könnte man das hübsch mit Values machen:
Code:
select id, merkmal, wert
 from test cross join lateral (
 values 
  (ist_reparatur, 'rep'),
  (ist_kontakt, 'kon'),
  (ist_bunt, 'bunt')
 ) as t(wert, merkmal)
order by 1,2;
oder analog zur Lösung von @akretschmer
Code:
select id, merkmal, wert
 from test cross join lateral (
 values 
  (ist_reparatur, 'rep'),
  (ist_kontakt, 'kon'),
  (ist_bunt, 'bunt')
 ) as t(wert, merkmal)
where wert 
order by 1,2;

in ms sql (keine Ahnung, wie man hier Spaltennamen definiert)
Code:
select id, merkmal, wert
 from test r
       UNPIVOT (  wert for merkmal in  (
          ist_reparatur ,
          ist_kontakt ,
          ist_bunt )
) as x
order by 1,2

Bei den expliziten Formulierungen mit values/cross ..lateral bzw. unpivot würde ich davon ausgehen, dass die Abfragen gut optimiert sind und mit weniger Full Scans auskommen als die Union Variante. Hab ich aber nicht getestet.
Ist bei kleineren Datenmengen aber auch wurscht und bei einer (einmaligen) Migration auch.
 
Zurück
Oben