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 的字符串聚合页面中找到有关如何执行此操作的一些说明.
在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)
请参阅我的博客中的这篇文章以获得解释:
尝试类似的东西:
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建议的自定义聚合函数代替了它。
| 归档时间: |
|
| 查看次数: |
81608 次 |
| 最近记录: |