9

I have two columns in oracle database

+---------+---------+
| Column1 | Column2 |
+---------+---------+
| A       | 1       |
| A       | 2       |
+---------+---------+

I want to retireive the data like i will get data as result

+---------+---------+
| Column1 | Column2 |
+---------+---------+  
| A       | 1,2     |
+---------+---------+

Please provide me the solution.

4

4 回答 4

19

Tim Hall在 Oracle 中有一个非常规范的字符串聚合技术列表。

您使用哪种技术取决于许多因素,包括 Oracle 的版本以及您是否正在寻找纯 SQL 解决方案。如果您使用的是 Oracle 11.2,我可能会建议使用LISTAGG

SELECT column1, listagg( column2, ',' ) WITHIN GROUP( order by column2 )
  FROM table_name
 GROUP BY column1

如果您使用的是早期版本的 Oracle,假设您不需要纯 SQL 解决方案,我通常更喜欢使用用户定义的聚合函数方法。

于 2012-08-27T16:06:08.590 回答
3

如果你有 10g,那么你必须通过下面的函数:

CREATE OR REPLACE FUNCTION get_comma_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 LTRIM(return_text, ',');
END;
/

所以,你可以这样做:

select col1, get_comma_separated_value(col1) from table_name

在这里提琴

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

SELECT 
    col1,
    LISTAGG(col2, ', ') WITHIN GROUP (ORDER BY col2) "names"
FROM table_x
GROUP BY col1

在这里为 Listagg 小提琴

对于 mysql,它会很简单:

SELECT col1, GROUP_CONCAT(col2) FROM table_name GROUP BY col1
于 2013-05-28T15:25:09.207 回答
3

所有答案都是正确的,我想添加一个案例来解决小问题。在我的情况下my_column1,类型是nvarchar2但文本是number,并且下面的代码不起作用并且只显示空格:

select group_id, listagg( t.my_column1 || '-' || to_char(t.doc_date,'dd.mm.yyyy') ||  ' ') within group(order by doc_date) 
 from my_table t
 group by group_id

当我这样写时,它起作用了。

select group_id, listagg( to_char(t.my_column1) || '-' || to_char(t.doc_date,'dd.mm.yyyy') ||  ' ') within group(order by doc_date) 
 from my_table t
 group by group_id

我希望我的反馈可以节省别人的时间

于 2019-07-05T09:47:03.790 回答
2

在我的 oracle 版本 10 上,它完成了这项工作:

SELECT column1, wm_concat( column2)
  FROM table_name
 GROUP BY column1
于 2018-08-24T10:05:06.823 回答