Есть ли запрос Oracle SQL, который объединяет несколько строк в одну строку?
У меня есть таблица, которая выглядит так:
A 1
A 2
B 1
B 2
И я хочу создать набор результатов, который выглядит так:
A 1 2
B 1 2
Есть ли инструкция SQL, которая будет делать это? Я использую Oracle.
Похожие вопросы:
Ответы
Ответ 1
Это зависит от версии Oracle, которую вы используете. Если он поддерживает функцию wm_concat(), вы можете просто сделать что-то вроде этого:
SELECT field1, wm_concat(field2) FROM YourTable GROUP BY field2;
wm_concat() в основном работает так же, как group_concat() в MySQL. Возможно, это не задокументировано, так что запустите старое sqlplus и посмотрите, есть ли там.
Если его там нет, тогда вы захотите реализовать что-то эквивалентное себе. Вы можете найти инструкции о том, как это сделать на странице странице агрегации строк на oracle-base.com.
Ответ 2
Довольно старая тема, но она может помочь другим, так как Oracle улучшилась в среднем.
Функция LISTAGG - это то, что вы ищете (по крайней мере в 11g)
Ответ 3
В Oracle 10g+
:
SELECT *
FROM (
SELECT *
FROM mytable
MODEL
PARTITION BY
(grouper)
DIMENSION BY
(ROW_NUMBER() OVER (PARTITION BY grouper ORDER BY id) AS rn)
MEASURES
(val, val AS group_concat, 0 AS mark)
RULES SEQUENTIAL ORDER (
group_concat[rn > 1] ORDER BY rn = group_concat[CV() - 1] || ', ' || val[CV()],
mark[ANY] ORDER BY rn = PRESENTV(mark[CV() + 1], 0, 1)
)
)
WHERE mark = 1
ORDER BY
grouper
Смотрите эту статью в своем блоге для объяснений:
Ответ 4
Попробуйте что-то вроде:
SELECT
field1,
RTRIM(REPLACE(REPLACE(XMLAgg(XMLElement("x", field2) ORDER BY field2), '<x>'), '</x>', ' ')) AS field2s
FROM yourTable
GROUP BY field1
Свободно вдохновлен ответом найденным в этом форуме Oracle.
EDIT: это решение оказалось очень ресурсом, интенсивным с запросами, включающими в себя что-то вроде 10 5 строк. Я заменил это на пользовательские агрегированные функции как предложенные Джоном.
Ответ 5
Если у вас есть 10g, вам нужно пройти через следующую функцию:
CREATE OR REPLACE FUNCTION get_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 return_text;
END;
/
Итак, вы можете сделать так:
select col1, get_separated_value(col1) from table_name
Заклинание здесь
Если у вас есть оракул 11g, вы можете использовать listagg:
SELECT
age,
LISTAGG(name, ' ') WITHIN GROUP (ORDER BY name) "names"
FROM table_x
GROUP BY age
Сценарий здесь для Listagg
Ответ 6
Пользовательские агрегированные функции: http://www.adp-gmbh.ch/ora/sql/user_def_agg.html
Просто скопируйте/вставьте и используйте его. Работает на 9i.
Ответ 7
SELECT a , COLLECT(b) FROM foo GROUP BY a
очень полезен при использовании в pl/sql - может быть отправлен в пользовательскую коллекцию.