是否有一个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中使用时非常有用 – 可以转换为用户定义的集合。