Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否存在将多行聚合为一行的Oracle SQL查询?_Sql_Oracle_Aggregation_String Concatenation - Fatal编程技术网

是否存在将多行聚合为一行的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
有关解释,请参见我博客中的这篇文章:


这是一个非常古老的话题,但它可以帮助其他人,因为Oracle在这段时间内有所改进

该功能正是您所需要的(至少在11g中)


在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已过期。想要查看的人可以试试这个