是否存在将多行聚合为一行的Oracle SQL查询?

use*_*807 31 sql oracle string-concatenation aggregation

我有一个看起来像这样的表:

A 1 
A 2 
B 1 
B 2
Run Code Online (Sandbox Code Playgroud)

我想生成一个如下所示的结果集:

A 1 2 
B 1 2
Run Code Online (Sandbox Code Playgroud)

是否有SQL语句可以执行此操作?我正在使用Oracle.

相关问题:

Joh*_*and 28

这取决于您使用的Oracle版本.如果它支持wm_concat()函数,那么你可以简单地做这样的事情:

SELECT field1, wm_concat(field2) FROM YourTable GROUP BY field2;
Run Code Online (Sandbox Code Playgroud)

wm_concat()基本上就像MySQL中的group_concat()一样.它可能没有记录,所以启动你的sqlplus,看看它是否存在.

如果它存在,那么你将希望自己实现相同的东西.您可以在oracle-base.com 的字符串聚合页面中找到有关如何执行此操作的一些说明.

  • 请注意,wmsys.wm_concat未记录且不受支持. (7认同)

小智 21

相当古老的主题,但它可以帮助其他人,因为甲骨文同时改善.

LISTAGG功能是你在找什么(在11g中至少)

  • 选择组中的不同c1,listagg(c2,'')(按c2排序)(c1分区)作为表中的c2_list; (2认同)

Qua*_*noi 9

Oracle 10g+:

SELECT  *
FROM    (
        SELECT  *
        FROM    mytable
        MODEL
        PARTITION BY
                (grouper)
        DIMENSION BY
                (ROW_NUMBER() OVER (PARTITION BY grouper ORDER BY id) AS rn)
        MEASURES
                (val, val AS group_concat, 0 AS mark)
        RULES SEQUENTIAL ORDER (
                group_concat[rn > 1] ORDER BY rn = group_concat[CV() - 1] || ', ' || val[CV()],
                mark[ANY] ORDER BY rn = PRESENTV(mark[CV() + 1], 0, 1)
                )
        )
WHERE   mark = 1
ORDER BY
        grouper
Run Code Online (Sandbox Code Playgroud)

请参阅我的博客中的这篇文章以获得解释:


Mac*_*Mac 5

尝试类似的东西:

SELECT
    field1,
    RTRIM(REPLACE(REPLACE(XMLAgg(XMLElement("x", field2) ORDER BY field2), '<x>'), '</x>', ' ')) AS field2s
  FROM yourTable
  GROUP BY field1
Run Code Online (Sandbox Code Playgroud)

本Oracle论坛中的答案自由启发。

编辑:事实证明,此解决方案非常耗费资源,涉及10 5行之类的请求。我最终用John建议的自定义聚合函数代替了它。


jva*_*jva 2

用户定义的聚合函数:http://www.adp-gmbh.ch/ora/sql/user_def_agg.html

只需复制/粘贴并使用它。适用于 9i。