Mehrere Datenzeilen einer Spalte in separaten Spalten darstellen

AkonBlade

Neuer Benutzer
Beiträge
1
Hallo,

ich bin neu hier und auch allgemein in der Handhabung von DBs.

Ich hätte ein Anliegen:

Ich möchte zwei Tabellen ansprechen, die bspw. so strukturiert sind:

Tabelle: Kundenauftrag
KundeVorgangsnummer
A
1​
A
2​
A
3​
A
4​
B
1​
B
2​
B
3​
B
4​
C
1​
C
2​
C
3​
C
4​

Tabelle: Auftragsbezeichnung


VorgangsnummerAuftragsbezeichnung
1​
Auftrag erteilt
2​
In Bearbeitung
3​
In Abnahme
4​
Abgeschlossen
1​
Auftrag erteilt
2​
In Bearbeitung
3​
In Abnahme
4​
Abgeschlossen
1​
Auftrag erteilt
2​
In Bearbeitung
3​
In Abnahme
4​
Abgeschlossen


Ist nur ein Beispiel. In einer bereits vorhandenen Abfrage möchte ich dann vier Spalten generieren, um es wieder am Beispiel zu projizieren:
KundeVorgang BeginnAuftrag BeginnVorgang EndeAuftrag Ende
A
1​
Auftrag erteilt
4​
Abgeschlossen
B
1​
Auftrag erteilt
4​
Abgeschlossen
C
1​
Auftrag erteilt
4​
Abgeschlossen

Also es soll immer nur eine Zeile pro Kunde dargestellt werden, dann würde ich gerne eine bestimmte Vorgangsnummer + dazugehörigen Auftrag in jeweils 2 Spalten darstellen. Dann erneut eine andere bestimmte Vorgangsnummer + Auftragstext in jeweils 2 Spalten.

Bisher kann ich irgendwie nur Vorgang Beginn + Auftrag Beginn oder Vorgang Ende + Auftrag Ende mit INNER JOIN abbilden. Und mit Case hat es irgendwie auch nicht funktioniert. Aber wie gesagt, das ist nur ein Bsp. und meine tatsächliche Abfrage ist sehr lang und möglicherweise blockiert es irgendwo anders, sodass ich deshalb nicht zum gewünschten Ziel komme. Als DB-Anfänger wäre ich über eine korrekte Abfrage in diesem Fall sehr dankbar, weil ich es dann mit etwas Umdenken auf meine Abfrage projizieren kann. Lieben Dank!
 
Werbung:
Ich habe eine Weile nachgedacht, kam aber nicht zu einer brauchbaren Antwort...
Mir ist bereits beim ersten lesen die Struktur ähnlich einem Dorn ins Auge gestochen.

Um mehrere Spalten in einer Spalte darzustellen, gibt es CONCAT-Funktionen, jedoch den Inhalt mehrerer Datensätze in einer Spalte darzustellen ist mir bisher nicht bekannt, ob es überhaupt möglich ist. Wenn dann gibt es evtl. bei irgendeiner SQL-Sprache ein Workaround, um sowas zu erreichen, was mir bisher nicht bekannt ist, ich würde dir aber raten, das Ganze von der Struktur erneut zu überdenken, auch wenn deine bisherige Abfrage noch so lange ist.

LG Kampfgummibaerlie

Gedanke am Ende:
Evtl. ist das irgendwie über ein Zugriffs-Programm lösbar und einem gewaltigem Workaround mit Multiarray, oder so...
 
Werbung:
ich denke, der Fragesteller sucht so etwas wie folgt:

Code:
postgres=# select * from vorgang ;
 id |      bez       
----+----------------
  1 | erteilt
  2 | in bearbeitung
  3 | abnahme
  4 | abgeschlossen
(4 rows)

postgres=# select * from auftrag ;
 kunde | vorgang 
-------+---------
 a     |       1
 a     |       2
 a     |       3
 a     |       4
 b     |       1
 b     |       2
 c     |       1
(7 rows)

postgres=# select a.kunde, string_agg(bez,'') filter (where v.id=1) as begin, string_agg(bez,'') filter (where v.id=2) as bearbeiting, string_agg(bez,'') filter (where v.id=3) as abnahme, string_agg(bez,'') filter (where v.id=4) as abgeschlossen from auftrag a left join vorgang v on a.vorgang=v.id group by a.kunde;
 kunde |  begin  |  bearbeiting   | abnahme | abgeschlossen 
-------+---------+----------------+---------+---------------
 a     | erteilt | in bearbeitung | abnahme | abgeschlossen
 b     | erteilt | in bearbeitung |         | 
 c     | erteilt |                |         | 
(3 rows)

postgres=#
 
Zurück
Oben