是否存在将多行聚合为一行的Oracle SQL查询?
我有一张这样的桌子:是否存在将多行聚合为一行的Oracle SQL查询?,sql,oracle,aggregation,string-concatenation,Sql,Oracle,Aggregation,String Concatenation,我有一张这样的桌子: A 1 A 2 B 1 B 2 A 1 2 B 1 2 SELECT field1, wm_concat(field2) FROM YourTable GROUP BY field2; 我想生成一个结果集,如下所示: A 1 A 2 B 1 B 2 A 1 2 B 1 2 SELECT field1, wm_concat(field2) FROM YourTable GROUP BY field2; 是否有SQL语句可以执行此操作?我正在使用Or
A 1
A 2
B 1
B 2
A 1 2
B 1 2
SELECT field1, wm_concat(field2) FROM YourTable GROUP BY field2;
我想生成一个结果集,如下所示:
A 1
A 2
B 1
B 2
A 1 2
B 1 2
SELECT field1, wm_concat(field2) FROM YourTable GROUP BY field2;
是否有SQL语句可以执行此操作?我正在使用Oracle
相关问题:
- 我的问题几乎与这个问题相反
- 这正是我想要做的,但是没有LINQ
只需复制/粘贴并使用它。适用于9i。这取决于您使用的Oracle版本。如果它支持wm_concat()函数,那么您可以简单地执行以下操作:
A 1
A 2
B 1
B 2
A 1 2
B 1 2
SELECT field1, wm_concat(field2) FROM YourTable GROUP BY field2;
wm_concat()的工作原理与MySQL中的基本相同。它可能没有文档记录,所以启动您的旧sqlplus,看看它是否存在
如果没有,那么您需要自己实现一些等效的东西。您可以在oracle base.com上的中找到有关如何执行此操作的说明。请尝试以下操作:
SELECT
field1,
RTRIM(REPLACE(REPLACE(XMLAgg(XMLElement("x", field2) ORDER BY field2), '<x>'), '</x>', ' ')) AS field2s
FROM yourTable
GROUP BY field1
选择
字段1,
RTRIM(将(XMLAgg(xmlement(“x”,field2)订单替换为field2),“”),“”)替换为field2s
从你的桌子上
按字段分组1
自由地受到回答的启发
编辑:此解决方案证明是非常资源密集型的,请求大约涉及105行。最后,我在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
有关解释,请参见我博客中的这篇文章:
在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,您可以使用:
您完全依赖于按rn排序的mytable。如果没有排序,您将得到“ORA-32637:顺序顺序模型中的自循环规则”。所以这个变种是童车。您可能想阅读我博客上的另一个model子句变体:@Rob:
rn
这里只是ROW\u NUMBER()
的别名。我从我的文章(使用了CTE
作为行源代码)中复制了它,但没有将其放入表中。谢谢你的注意。是的,我知道。但是,例如,如果您使用了另一个具有不同顺序的分析函数,并且最后执行了相应的窗口排序操作,则会出现上述错误。因此,您仍然必须使用有序规则求值来实现这一想法。@Rob:再次正确,更新,使用6-ROW\u NUMBER()检查(按分组顺序按rno划分)作为rn
。谢谢。请注意wmsys.wm_concat没有文档记录,不受支持。当我在11g数据库上尝试它时,请参阅类似的问题,强制转换是必需的。但我给你+1是因为我不知道COLLECT函数存在——Oracle添加了太多的功能,无法跟上。从表中选择distinct c1,listag(c2',)in group(order by c2)over(partition by c1)作为c2_list;url已过期。想要查看的人可以试试这个