Ссылка @Dems размещена функционально идентична вашим требованиям.
Однако, в случае, если у вас нет доступа к функциям XML, здесь рекурсивный версия CTE:
WITH Indexed(id, value, index)
as (SELECT id, value, ROW_NUMBER() OVER(PARTITION BY id ORDER BY value)
FROM ValueTable),
Concatenated(id, index, concatenated)
as (SELECT id, index, value
FROM Indexed
WHERE index = 1
UNION ALL
SELECT a.id, a.index + 1, a.concatenated || ', ' || b.value
FROM Concatenated as a
JOIN Indexed as b
ON b.id = a.id
AND b.index = a.index + 1)
SELECT a.id, a.value
FROM Concatenated as a
EXCEPTION JOIN Indexed as b
ON b.id = a.id
AND b.index > a.index
Если у вас есть уникальный индекс исходной таблицы, Indexed
CTE может быть заменен ссылка на исходную таблицу.
Это может показаться легкомысленным, но, как правило, ответ на самом деле «не стоит». Если вы хотите сделать это по причинам показа, выполните эту обработку в своем приложении. Если вы хотите сделать это по причинам данных, сохраните данные как нормализованные отношения 1: многие и рассмотрите способы их обработки в этом формате (мы можем помочь с этим, если вы разместите прецедент, с которым имеете дело). Но сжатие нескольких значений в одном значении, как правило, является анти-шаблоном SQL, который вызывает больше боли в будущем, чем того стоит. – MatBailie
@Dems Вы правы. Причина заключается в специальном запросе шеф-повара. – Kayser
Возможный дубликат [Создать строку с разделителем из запроса в DB2] (http://stackoverflow.com/questions/3728010/create-a-delimited-string-from-a-query-in-db2) – MatBailie