SQL SQL in einer Abfrage Werte aus mehreren Zeilen ausgeben

CuNoah

Cadet 4th Year
Registriert
Aug. 2009
Beiträge
84
Hallo zusammen,

habe folgende Tabelle, vereinfacht dargestellt

Referenz | Zähler | Text

Es ist möglich, dass zu einer Referenz mehrere Texte hinterlegt sind, diese werden dann durch den Zähler unterschieden. Kann ich in einer Abfrage alle Einträge zu einer Referenz ermitteln und diese in der Reihenfolge der Zähler ausgeben?

Als Beispiel
Referenz | Zähler | Text
1001 | 1 | Text 1 zu 1001
1001 | 2 | Text 2 zu 1001
1002 | 1 | Text 1 zu 1002

Ich würde gerne mit einer Abfrage folgende Ausgabe erhalten:
1001 | Text 1 zu 1001 | Text 2 zu 1001


Hat da evtl. jemand einen kleinen Tipp?

Vielen Dank.
 
GROUP_CONCAT ist glaube das richtige Stichwort für dein problem :)

SELECT Referenz, GROUP_CONCAT(`Zaehler` SEPARATOR ',') as Zaehler, GROUP_CONCAT(`text` SEPARATOR ' | ') as txt FROM test GROUP BY Referenz
 
Zuletzt bearbeitet:
Danke für den Hinweis, hatte vergessen zu schreiben, dass es ein Oracle System ist, aber über den Hinweis Group_Concat bin ich auf LISTAGG Analytic Function in 11g Release 2 gekommen, damit kann man die Werte zusammenfassen :)
Leider landet dann alles in einer Spalte, das geht auch, lieber wäre mir noch, wenn man jeweils eine eigene Spalte hätte. Mal sehen, ob es in die Richtung auch was gibt. Auf jeden FAll noch mal Danke! :)


SELECT Referenz, LISTAGG(Text, ',') WITHIN GROUP (ORDER BY Zähler) AS Texte
FROM Tabelle
GROUP BY Referenz;
 
Zuletzt bearbeitet: (Beispiel eingefügt.)
Gibt es eine feste Obergrenze für Zähler? Dann könnte man mit Hilfe von Subselects oder Joins ein Select bauen, das entsprechend dieser Obergrenze immer so viele Spalten wieder gibt. Also auch leere Spalten wenn der Zähler kleiner ist.

Wenn die Anzahl der Spalten variabel sein soll, dann fällt mir als Lösung nur eine Stored Procedure ein, welches das Select entsprechend dem Wert von Zähler zusammen baut.
 
Obergrenze vom Zähler ist 4, wäre also eine alternative. Mal sehen, ob ich da was finde :)

Ich weiß, dass die Tabelle nicht ideal ist, mir wäre es lieber, wenn wir einfach zu jeder Referenz 4 Felder hätten. Also Text1, Text2 usw. Aber die Tabelle stammt aus einer externen Anwendung und für die Weiterverarbeitung wäre es eine große Hilfe, wenn man die Abfrage in einem Select lösen kann.
 
Eine Lösung mit Subselects (ungetested)
Code:
SELECT DISTINCT T.Referenz AS Referenz, 
  (SELECT I1.Text FROM Tabelle I1 WHERE I1.Referenz=T.Referenz AND I1.Zähler=1) AS Text1,
  (SELECT I2.Text FROM Tabelle I2 WHERE I2.Referenz=T.Referenz AND I2.Zähler=2) AS Text2,
  (SELECT I3.Text FROM Tabelle I3 WHERE I3.Referenz=T.Referenz AND I3.Zähler=3) AS Text3,
  (SELECT I4.Text FROM Tabelle I4 WHERE I4.Referenz=T.Referenz AND I4.Zähler=4) AS Text4
FROM Tabelle T;
Ich würde es vermeiden, Umlaute bei Tabellenspalten zu verwenden. Das führt potentiell zu Fehlern bei Import und Export.

Variante mit Join
Code:
SELECT DISTINCT T.Referenz AS Referenz, I1.Text AS Text1, 
  I2.Text AS Text2, I3.Text AS Text3, I4.Text AS Text4
FROM Tabelle T
  LEFT JOIN Tabelle I1 ON T.Referenz=I1.Referenz AND I1.Zähler=1
  LEFT JOIN Tabelle I2 ON T.Referenz=I2.Referenz AND I2.Zähler=2
  LEFT JOIN Tabelle I3 ON T.Referenz=I3.Referenz AND I3.Zähler=3
  LEFT JOIN Tabelle I4 ON T.Referenz=I4.Referenz AND I4.Zähler=4;
 
Zuletzt bearbeitet:
Vielen Dank, ich teste morgen und melde mich wieder. Mir war nicht bekannt, dass man die Abfrage in dieser Form aufbauen kann :)
 
Perfekt, so hat es geklappt :) Vielen Dank für die Hilfe und die Beispiele.
 
Zurück
Oben