2016-11-21 3 views
1

Ich habe die folgende Ausgabe:SQL verketten eine der Spalten

portfolio name | accounts | segment | number 
A | USD | seg1 | 23 
A | CNY | seg2 | null 
A | EUR | seg2 | null 
B | EUR | seg2 | null 
B | USD | seg2 | null 
B | EUR | seg3 | 24 

Und ich möchte im Grunde die alle Zeilen nach Portfolio Name, gleiche Segment und gleiche Anzahl verketten. Wie Sie sehen können, kann die Nummer auch null sein.

Grundsätzlich ist die End-Ausgang i für dieses Beispiel wollen, ist:

A | USD | seg1 | 23 
A | CNY, EUR | seg2 | null 
B | EUR, USD | seg2 | null 
B | EUR | seg3 | 24 

ich mit listagg habe versucht, aber kann es nicht herausgefunden ...

Hoffe, dass Sie meine Frage verstehen.

+0

Mindestens unterstützen einige von ihnen die ANSI SQL '' || Verkettung. – jarlh

+0

Ihre Ausgabe scheint nicht logisch der Eingabe zu folgen. –

+0

Hinzugefügt 'oracle' Tag basierend auf der Erwähnung von' listagg() ' –

Antwort

1

Wenn Sie Oracle verwenden (Sie sagten, Sie versucht LISTAGG zu verwenden), dann:

SELECT t.portfolio_name, t.segment, 
     LISTAGG(COALESCE(t.accounts,''),',') WITHIN GROUP (ORDER BY t.accounts) as segments, 
     (SELECT LISTAGG(COALESCE(s.number,''),',') WITHIN GROUP (ORDER BY s.number) 
     FROM (SELECT DISTINCT p.portfolio_name,p.segment,p.number 
       FROM YourTable p) s 
     WHERE t.portfolio_name = s.portfolio_name 
      AND t.segment = s.segment) as numbers 
FROM YourTable t 
GROUP BY t.portfolio_name, t.segment 
+0

Danke das ist fast perfekt. Gibt es eine Möglichkeit, Zahlen nur bestimmte Werte enthalten zu lassen? – user3438447

+1

@ user3438447 Sie sollten Ihr Beispiel aktualisieren, um anzuzeigen, was Sie hier sehen möchten. –

+0

Die Spalte "numbers" enthält nun Duplikate. Beispiel: ACC123, ACC123, ACC123 usw. Und für den Fall, dass die Zahlspalte null war, ist es,,, usw. Wir hoffen, Sie verstehen, was ich meine. – user3438447

-1

Wenn Spalten die concat alle Spalten festgelegt sind, aber stellen Sie sicher, dass die für diesen Ausgang müssen Sie als String null konvertieren . Zum Beispiel: Select c1 + '|' + Besetzung (c2 als varchar) von t1

+0

Ihre Antwort scheint nicht zu beziehen, was das OP verlangt. – Boneist

0
select   "portfolio name" 
       ,listagg (accounts,',') within group (order by accounts) as accounts 
       ,segment 
       ,"number" 

from   t 

group by  "portfolio name" 
       ,segment 
       ,"number" 
; 
Verwandte Themen