SQL – несколько значений, разделенных запятой при использовании GROUP BY [дубликат]

StackOverflow https://stackoverflow.com/questions/234532

  •  04-07-2019
  •  | 
  •  

Вопрос

У меня есть данные, которые выглядят так

CUSTOMER,  CUSTOMER_ID, PRODUCT
ABC INC    1            XYX
ABC INC    1            ZZZ
DEF CO     2            XYX
DEF CO     2            ZZZ
DEF CO     2            WWW
GHI LLC    3            ZYX

Я хотел бы написать запрос, который придал бы данным следующий вид:

CUSTOMER, CUSTOMER_ID, PRODUCTS
ABC INC   1            XYX, ZZZ
DEF CO    2            XYX, ZZZ, WWW
GHI LLC   3            ZYX

Использование Oracle 10g, если поможет.Я видел что-то, что работало бы с использованием MYSQL, но мне нужен простой эквивалент SQL или ORACLE.Я также видел примеры хранимых процедур, которые можно было бы создать, однако я не могу использовать хранимые процедуры с продуктом, который использую.

Вот как бы это работало в MySQL, если бы я его использовал

SELECT CUSTOMER, 
       CUSTOMER_ID, 
       GROUP_CONCAT( PRODUCT ) 
FROM MAGIC_TABLE 
GROUP BY CUSTOMER, CUSTOMER_ID

Спасибо.

Это было полезно?

Решение

Эта ссылка относится к ряду примеров различных способов сделать это в Oracle.Посмотрите, есть ли там что-то, на что у вас есть разрешения в вашей базе данных.

Другие советы

Я думаю, что LISTAGG — лучшая совокупная группа по функциям для использования в этой ситуации:

  SELECT CUSTOMER, CUSTOMER_ID,
         LISTAGG(PRODUCT, ', ') WITHIN GROUP (ORDER BY PRODUCT)
    FROM SOME_TABLE
GROUP BY CUSTOMER, CUSTOMER_ID
ORDER BY 1, 2

Пользовательская функция oracle «wm_concat» работает так же, как LISTAGG, за исключением того, что вы не можете указать разделитель «,» по умолчанию или порядок сортировки.Однако он совместим с 10g.

Спасибо, Найджел,

Мой SQL не так элегантен, как мог бы быть, но мне нужно было решение, требующее только SQL, а не PLSQL или TSQL, поэтому в итоге оно выглядело так:

SELECT   CUSTOMER, CUSTOMER_ID, COUNT(PRODUCT) PROD_COUNT, 
         RTRIM( 
            XMLAGG( XMLELEMENT (C, PRODUCT || ',') ORDER BY PRODUCT
).EXTRACT ('//text()'), ',' 
         ) AS PRODUCTS FROM     (
         SELECT   DISTINCT CUSTOMER, CUSTOMER_ID, PRODUCT
         FROM     MAGIC_TABLE
         ) GROUP BY CUSTOMER, CUSTOMER_ID ORDER BY 1 , 2

Все еще не совсем уверен, что именно делают функции XML, но я покопаюсь, когда возникнет необходимость.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top