Einträge in drei Spalten zusammen ausgeben und gruppieren

Hallo,

ich stehe gerade bei einem Problem auf dem Schlauch und hoffe, ihr könnt mir dabei helfen :slight_smile:

Ich möchte gerne, dass alle Namen, die in 3 Spalten vorkommen, insgesamt nur 1x ausgegeben werden.

Tabelle ‚auftraege‘

  • id (Primärschlüssel)
  • name1
  • name2
  • name3

Beispielhafte Eintragungen:

id | name1 | name2 | name3

1 | Christian | Martin | Melissa
2 | Peter | Friedrich | Christian
3 | Anton | Melissa | Karl
4 | Martin | Stefan | Anton

Folgende Ausgabe soll erfolgen:

Anton
Christian
Friedrich
Martin
Melissa
Peter
Stefan

Kurz gesagt: Die 3 Spalten „name1“, „name2“ und „name3“ sollen zusammengelegt und die Einträge darin bei mehrmaligem Vorkommen nur 1x ausgegeben werden.

Bei der nachfolgenden Abfrage:

SELECT name1, name2, name3 FROM auftraege GROUP BY name1, name2, name3

Werden alle 3 Spalten ausgegeben, was ja auch logisch ist. Concat bringt mich auch nicht weiter, da ich die Namen ja nicht zusammenlegen möchte :-/

Hat jemand eine Idee?

Vielen Dank im Voraus!

Hi,

kennt dein DBMS „union“? Das könnte helfen.
https://blogs.sap.com/2017/10/30/union-distinct-vs-all/

Gruß
Christa

P. S. Die Beispiele, die es zu union gibt, auf verschiedenen Seiten, greifen meistens auf verschiedene Tabellen zu, du solltest sie aber auch alle auf dieselbe Tabelle anwenden können.

Hi Christa,

vielen herzlichen Dank für deine Rückmeldung. Das scheint die Lösung zu sein :slight_smile:

SELECT name1 FROM auftraege
UNION SELECT name2 FROM auftraege
UNION SELECT name3 FROM auftraege

Damit werden mir jetzt die Namen aus allen 3 Spalten nur 1x zusammengefasst ausgegeben - perfekt.

Einziges Problem was ich noch hätte: Wie kann ich die Ausgabe noch alphabetisch sortieren? Ich habe ja 3 unterschiedliche Spaltennamen :-/

Beste Grüße

Hallo,

ehrlich gesagt habe ich union seit dem Studium nicht mehr verwendet, und das war in den 90ern. :joy: Wie sieht die Spalte aus bei der Ausgabe, hat sie eine Überschrift? Normalerweise hätte man etwas mit einem Alias gemacht, aber bei der Syntax mit union wüsste ich nicht auf Anhieb, wo man das einbauen könnte.

Du kannst es evtl. damit versuchen:

select name1 as name from auftraege
union select name2 from auftraege
union select name3 from auftraege
order by name;

Gruß
Christa

Das kommt etwas auf das DBMS an. Prinzipiell immer sollte möglich sein, den UNION-SELECT in einen SUB-SELECT zu packen und das dann zu sortieren. Allerdings ist so ein Konstrukt nicht performant.

SELECT * FROM (SELECT ... FROM ... UNION SELECT ... FROM ...) ORDER BY 1 ;

Zumindest in MS SQL funktioniert @Christa’s Ansatz.
Die Spalte bekommt normalerweise den Namen name1 aus dem ersten SELECT, die anderen Werte werden dann angehängt. Mit dem as name wird der Spalte ein eigener Name verpasst, nach dem man auch sortieren kann.

Dass man auch die Spaltennummer angeben kann, hatte ich für den Moment vergessen. An sich müsste dann meine Abfrage auch ohne Alias funktionieren, nur mit order by 1 statt order by name, wenn er nur die eine Spalte ausgeben will.

Union war auch mein erster Gedanke, aber da ich 1) union selber ständig benutze und ich weiß, das ich beim Googeln nach Problemen 2) immer wieder auf neue Syntax stoße, habe ich gesucht und gefunden und unpivot entdeckt:

select distinct colval from auftraege
unpivot (colval for col in (name1,name2,name3))
order by 1

colval ist natürlich frei definierbar und das neue Wertefeld, col das neue Feld, in dem man auch noch den Spaltennamen mitausgeben könnte.

Das Ganze funktioniert unter Oracle, ob es in anderen DBMS auch so einfach geht, fehlt mir derzeit die Lust und Zeit.

Ich habe jetzt nochmal etwas recherchiert …

Der ANSI-Standard, nach dem sich die DBMS-Hersteller zunehmend richten, sieht den von @Christa vorgeschlagenen Syntax vor. (Für mich ist der zwar etwas inkonsitent zum sonstigen Regelwerk und verstößt somit IMHO gegen das Prinzip der geringsten Verblüffung, aber es ist halt so.)

Der Syntax sollte also auch bei vielen DBMSen funktionieren. Der von mir vorgeschlagene Syntax hat bei allen von mir im Verlauf der Jahre genutzen DBMSen immer funktioniert. Am Ende dürfte das auch performaceseitig keinen großen Unterschied machen, wenn das DBMS einen guten Optimierer hat.

Auch das steht so im ANSI-Standard.

Das Sortieren mit der Ordnungszahl ist IMHO Recht elegant, aber es sollte auch wegen o. g. ohne Alias mit ORDER BY Name1 gehen.