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 に答える