【问题标题】:SQL concatenate one of the columnsSQL 连接其中一列
【发布时间】:2016-11-21 15:18:43
【问题描述】:

我有以下输出:

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 也可以为 null。

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

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

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

希望你能理解我的问题。

【问题讨论】:

  • 至少其中一些支持 ANSI SQL || 连接。
  • 您的输出似乎与输入的逻辑不一致。
  • 在提到listagg()的基础上添加了oracle标签
  • @TimBiegeleisen 抱歉现在修改了我的示例。

标签: sql oracle concatenation listagg


【解决方案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

【讨论】:

  • 谢谢,这几乎是完美的。有没有办法让数字只包含不同的值?
  • @user3438447 您应该更新您的示例以在此处显示您想要的内容。
  • 数字列现在包含重复项。例如:ACC123,ACC123,ACC123 等。如果数字列为空,则为 , , , 等。希望你明白我的意思。
  • 这段代码包含很多错误 + 它的逻辑比它应该的要复杂得多。
  • 为什么是COALESCE(<column>,'')?您实际上是在说“当 为 null 时,则输出 null”,因为 Oracle 没有空字符串的概念
【解决方案2】:
select          "portfolio name"
               ,listagg (accounts,',') within group (order by accounts) as accounts
               ,segment
               ,"number"

from            t

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 您的答案似乎与 OP 的要求无关。
    猜你喜欢
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    相关资源
    最近更新 更多