1

我有以下输出:

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

我想基本上根据投资组合名称、相同的段和相同的编号连接所有行。正如您所看到的,有时 number 也可以为空。

基本上我想要这个例子的最终输出是:

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

我尝试过使用 listagg 但无法弄清楚...

希望你能理解我的问题。

4

3 回答 3

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
于 2016-11-21T15:24:00.943 回答
0
select          "portfolio name"
               ,listagg (accounts,',') within group (order by accounts) as accounts
               ,segment
               ,"number"

from            t

group by        "portfolio name"
               ,segment
               ,"number"
;
于 2016-11-21T16:13:03.380 回答
-1

如果列是固定的,则连接所有列,但请确保对于此输出,您需要将 null 转换为字符串。例如:select c1+'|'+cast(c2 as varchar) from t1

于 2016-11-21T15:36:58.080 回答