2016-11-21 17 views
1

我有以下的輸出:SQL串連的一列

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 

而且我想根據投資組合的名字,同一個網段和同一號碼基本上串連所有行。正如你所看到的,有時候數字也可以是空的。

基本上結束時輸出我想這個例子是:

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

我一直在使用LISTAGG嘗試,但不能弄明白......

希望你明白我的問題。

+0

+投(C2爲varchar)至少其中的一些支持ANSI SQL''||串聯。 – jarlh

+0

您的輸出似乎不符合邏輯上的輸入。 –

+0

根據提到的listagg()增加了'oracle'標籤' –

回答

1

如果您使用的是Oracle(你說你試圖使用LISTAGG),則:

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

謝謝,這幾乎是完美的。有沒有辦法讓數字只包含不同的值? – user3438447

+1

@ user3438447您應該更新您的示例以顯示您想要的內容。 –

+0

數字列現在包含重複項。例如:ACC123,ACC123,ACC123等。而在數字列爲空的情況下,它是,等等。希望你明白我的意思。 – user3438447

-1

如果列固定的CONCAT所有列,但請確保該輸出需要空轉換爲字符串。 例如: 選擇C1 + '|' 從T1

+0

您的回答似乎與OP要求的內容有關。 – Boneist

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

from   t 

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