是否存在将多行聚合为一行的Oracle SQL查询?

时间:2009-07-13 16:50:46

标签: sql oracle aggregation string-concatenation

我有一个看起来像这样的表:

A 1 
A 2 
B 1 
B 2

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

A 1 2 
B 1 2

是否有SQL语句可以执行此操作?我正在使用Oracle。

相关问题:

7 个答案:

答案 0 :(得分:28)

这取决于您使用的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找到有关如何执行此操作的一些说明。

答案 1 :(得分:21)

相当古老的主题,但由于Oracle在同一时间内有所改进,因此可以帮助其他人。

你正在寻找LISTAGG功能(至少11g)

答案 2 :(得分:9)

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

在我的博客中查看此文章以获得解释:

答案 3 :(得分:5)

尝试类似:

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个 5 行的请求。我最终将自定义聚合函数替换为suggested by John

答案 4 :(得分:4)

如果你有10克,那么你必须完成以下功能:

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

Fiddle here

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

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

Fiddle here for Listagg

答案 5 :(得分:2)

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

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

答案 6 :(得分:2)

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

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