SQL – несколько значений, разделенных запятой при использовании GROUP BY [дубликат]
Вопрос
На этот вопрос уже есть ответ здесь:
У меня есть данные, которые выглядят так
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, но я покопаюсь, когда возникнет необходимость.