2016-11-21 1 views
1

je la sortie suivante:SQL concaténer une des colonnes

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 

Et je voudrais concaténer essentiellement toutes les lignes en fonction du nom du portefeuille, même segment et même nombre. Comme vous pouvez le voir, le nombre peut aussi être nul.

Fondamentalement, la sortie de fin que je veux pour cet exemple est:

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

J'ai essayé d'utiliser listagg mais ne peut pas le comprendre ...

espère que vous comprenez ma question.

+0

Au moins certains d'entre eux prennent en charge la norme ANSI SQL '' || concaténation. – jarlh

+0

Votre sortie ne semble pas suivre logiquement l'entrée. –

+0

Ajout de la balise 'oracle' basée sur la mention' listagg() ' –

Répondre

1

Si vous utilisez Oracle (Vous avez dit que vous avez essayé d'utiliser LISTAGG) puis:

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

Merci c'est presque parfait. Est-il possible de faire en sorte que les chiffres incluent uniquement des valeurs distinctes? – user3438447

+1

@ user3438447 Vous devriez mettre à jour votre exemple pour montrer ce que vous voulez ici. –

+0

La colonne des nombres contient maintenant des doublons. exemple: ACC123, ACC123, ACC123 etc. Et dans le cas où la colonne de nombre était nulle c'est,,,, etc. J'espère que vous comprenez ce que je veux dire. – user3438447

-1

Si des colonnes sont fixées les concat toutes les colonnes, mais assurez-vous que le pour cette sortie, vous devez convertir null en tant que chaîne . Par exemple: Select + c1 '|' + cast (c2) comme varchar de t1

+0

Votre réponse ne semble pas se rapporter à ce que le PO demande. – Boneist

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

from   t 

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