Если вы ищете только одну строку с разными продуктами, то метод Лукаша работает нормально.
Если вы действительно хотите какие-либо другие столбцы сводки, то, вероятно, они не будут делать то, что вы хотите. Вы можете использовать это вместо:
SELECT LISTAGG(CASE WHEN seqnum = 1 THEN product_name END, chr(10))
WITHIN GROUP (ORDER BY product_name) as Product_Listing
FROM (SELECT p.*,
ROW_NUMBER() OVER (PARTITION BY product_name ORDER BY product_name) as seqnum
FROM products p
) p;
Я не советую удалять дубликаты после LISTAGG()
, хотя бы потому, что Oracle накладывает довольно короткий предел на результат. Но вы можете сделать это как:
SELECT REGEXP_REPLACE(LISTAGG(product_name END, chr(10)) WITHIN GROUP (ORDER BY product_name),
'([^\x10]+)(\x10\1)+',
'\1'
) as Product_Listing
FROM products p;
Удаляет соседние дубликаты. Из-за ORDER BY
дубликаты находятся рядом. Так что должно работать.