是否有一个Oracle SQL查询将多个行聚合成一行?

我有一个如下所示的表格:

A 1 A 2 B 1 B 2 

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

 A 1 2 B 1 2 

有没有一个SQL语句可以做到这一点? 我正在使用Oracle。

相关问题:

  • 从单行返回多行我的问题接近于这个问题的反面。
  • 使用LINQ连接这正是我想要做的,但没有LINQ。

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

 SELECT field1, wm_concat(field2) FROM YourTable GROUP BY field2; 

wm_concat()基本上像MySQL中的group_concat()一样工作。 它可能没有logging,所以火了你的sqlplus,看看它是否在那里。

如果它不在那里,那么你会想要实现自己的东西。 您可以在oracle-base.com的string聚合页面上find一些关于如何执行此操作的说明。

相当古老的话题,但是由于Oracle在此期间得到了改进,它可以帮助其他人。

LISTAGG函数是你正在寻找的(至less在11g)

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 

在我的博客中看到这篇文章的解释:

  • Oracle 10g GROUP_CONCAT

尝试像这样:

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

在这个Oracle论坛中find的答案自由灵感。

编辑:这个解决scheme被certificate非常耗费资源,涉及类似10 5行的请求。 我最终取而代之的是由约翰build议的自定义聚合函数。

如果你有10g,那么你必须经过下面的function:

 CREATE OR REPLACE FUNCTION get_separated_value (input_val in number) RETURN VARCHAR2 IS return_text VARCHAR2(10000) := NULL; BEGIN FOR x IN (SELECT col2 FROM table_name WHERE col1 = input_val) LOOP return_text := return_text || ' ' || x.col2 ; END LOOP; RETURN return_text; END; / 

所以,你可以这样做:

 select col1, get_separated_value(col1) from table_name 

在这里拨弄

如果你有oracle 11g,你可以使用listagg :

 SELECT age, LISTAGG(name, ' ') WITHIN GROUP (ORDER BY name) "names" FROM table_x GROUP BY age 

在这里为Listagg拨弄

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

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

 SELECT a , COLLECT(b) FROM foo GROUP BY a 

在pl / sql中使用时非常有用 – 可以转换为用户定义的集合。