SQL 连接其中一列
SQL concatenate one of the columns
我有以下输出:
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 但无法弄清楚...
希望你能理解我的问题。
如果您使用的是 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
如果列是固定的,则连接所有列,但要确保对于此输出,您需要将 null 转换为字符串。
例如:
Select 来自 t1
的 c1+'|'+cast(c2 as varchar)
select "portfolio name"
,listagg (accounts,',') within group (order by accounts) as accounts
,segment
,"number"
from t
group by "portfolio name"
,segment
,"number"
;
我有以下输出:
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 但无法弄清楚...
希望你能理解我的问题。
如果您使用的是 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
如果列是固定的,则连接所有列,但要确保对于此输出,您需要将 null 转换为字符串。 例如: Select 来自 t1
的 c1+'|'+cast(c2 as varchar)select "portfolio name"
,listagg (accounts,',') within group (order by accounts) as accounts
,segment
,"number"
from t
group by "portfolio name"
,segment
,"number"
;