【问题标题】:SQL concatenate one of the columns in groups of 10 with LISTAGG()SQL 用 LISTAGG() 将 10 个一组的列连接起来
【发布时间】:2016-11-28 13:22:53
【问题描述】:

我需要帮助编写一个可以连接一组 10 列的查询。

例子:

id1 | string1
id1 | string2
id1 | string3
...
id1 | string 1000

由于 SQL 不允许连接太大的字符串,我想一次将 10 个分组,以便得到:

id1 | string1,string2,...,string10
id1 | string11,string12,...,string20

谢谢

【问题讨论】:

  • 您在使用 Oracle 吗? (添加该标签。)
  • 请提及您正在使用的 DBMS。

标签: sql oracle concatenation listagg


【解决方案1】:
select      id,listagg (str,',') within group (order by str)

from       (select      id,str,row_number () over (partition by id order by str) - 1    as rn
            from        t
            ) 

group by    id,floor (rn / 10)
;

或者如果您不关心订单 -

select      id,listagg (str,',') within group (order by null)

from       (select      id,str,rownum - 1 as rn
            from        t
            ) 

group by    id,floor (rn / 10)
;

样本

create table t
as
select          'id'    || to_char(ceil(level/100))     as id
                ,'str'  || lpad(to_char(level),4,'0')   as str
from            dual
connect by      level <= 1000
;

【讨论】:

  • 如果你做 ceil(rn/10) 你不需要费心从 rownum / row_number() 中减去一个,fwiw。
  • @Boneist,这是真的,但由于我正在使用多个数据库并且其中一些使用整数运算,我喜欢保持类似的逻辑。
  • 我不确定这与切换(或不)使用 ceil 而不是 floor 有什么关系?
  • @Boneist,当支持整数运算时,您的 GROUP BY 表达式是什么?
  • 谢谢,不幸的是我没有得到我想要的结果。我尝试了你的建议并得到:id1 | string1,string1,string1... 和 id1 |字符串2,字符串2,字符串2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 1970-01-01
相关资源
最近更新 更多