我有一个表,看起来像这样:是否存在将多行聚合到一行的Oracle SQL查询?
A 1
A 2
B 1
B 2
我想产生一个结果集,看起来像这样:
A 1 2
B 1 2
是否有一个SQL语句,将做到这一点?我正在使用Oracle。
相关问题:
- Returning multiple rows from a single row我的问题是接近这个问题的反面。
- Use LINQ to concatenate这正是我想要做的,但没有LINQ。
我有一个表,看起来像这样:是否存在将多行聚合到一行的Oracle SQL查询?
A 1
A 2
B 1
B 2
我想产生一个结果集,看起来像这样:
A 1 2
B 1 2
是否有一个SQL语句,将做到这一点?我正在使用Oracle。
相关问题:
用户定义的聚合函数:http://www.adp-gmbh.ch/ora/sql/user_def_agg.html
只是复制/粘贴,并使用它。适用于9i。
这取决于您使用的Oracle版本。如果它支持wm_concat()函数,那么你可以简单地做这样的事情:
SELECT field1, wm_concat(field2) FROM YourTable GROUP BY field2;
wm_concat()基本工作原理就像在MySQL group_concat()。它可能没有记录,所以开始你的sqlplus,看看它是否存在。
如果它不是不是那么,那么你会想要实现你自己的东西。您可以在oracle-base.com上的string aggregation page中找到有关如何执行此操作的说明。
请注意,wmsys.wm_concat没有记录和不受支持。 – turbanoff 2011-12-16 03:46:40
尝试类似:
SELECT
field1,
RTRIM(REPLACE(REPLACE(XMLAgg(XMLElement("x", field2) ORDER BY field2), '<x>'), '</x>', ' ')) AS field2s
FROM yourTable
GROUP BY field1
通过回答found in this Oracle forum自由启发。
编辑:该解决方案被证明非常资源密集型与包括像10个行请求。我最终将自定义聚合函数替换为suggested by John。
在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
请参阅本文中我的博客解释:
你完全依赖mytable按rn排序。如果它没有排序,你会得到一个“ORA-32637:顺序排序MODEL中的自循环规则”。所以这个变种是越野车。您可能想在我的博客上阅读另一个模型子句变体:http://rwijk.blogspot.com/2008/05/string-aggregation-with-model-clause.html – 2009-07-29 19:20:44
@Rob:`rn`这里只是一个别名为`ROW_NUMBER()`。我从我的文章(使用`CTE`作为行源)复制它,但没有把它放到表格中。感谢您的注意。 – Quassnoi 2009-07-29 20:36:01
很老的话题,但它可以帮助别人,因为甲骨文在改善与此同时。
的LISTAGG功能是你在找什么(在11g中至少)
SELECT a , COLLECT(b) FROM foo GROUP BY a
在PL/SQL中使用时是非常有用的 - 可浇铸为用户定义的集合。
如果你有10g中,那么你必须要经过以下功能:
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
http://stackoverflow.com/questions/492563/oracle-combine-multiple-results-in-a-subquery-into-a-single-comma-separated-valu – derobert 2011-02-03 21:38:08
查看类似的问题[咨询-using-pivot-table-in-oracle](http://stackoverflow.com/questions/365238/advice-using-pivot-table-in-oracle) – 2009-07-13 16:56:22