Существует ли SQL-запрос Oracle, который агрегировал несколько строк в одну строку? [дубликат]

Я пытался сделать это с Системой. Среда назад, когда я изучал дополнительные методы и не был успешен. Причина, как другие упоминают, потому что дополнительные методы требуют экземпляра класса.

31
задан Community 23 May 2017 в 12:24
поделиться

4 ответа

User defined aggregate functions: http://www.adp-gmbh.ch/ora/sql/user_def_agg.html

Just copy/paste and use it. Works on 9i.

2
ответ дан 27 November 2019 в 21:56
поделиться

Это зависит от версии Oracle, которую вы используете. Если он поддерживает функцию wm_concat (), вы можете просто сделать что-то вроде этого:

SELECT field1, wm_concat(field2) FROM YourTable GROUP BY field2;

wm_concat () в основном работает так же, как group_concat () в MySQL. Это может быть не задокументировано, поэтому запустите старый sqlplus и посмотрите, есть ли он там.

Если его нет , тогда вы захотите реализовать что-то эквивалентное самостоятельно. Вы можете найти инструкции, как это сделать, на странице агрегирования строк на oracle-base.com.

28
ответ дан 27 November 2019 в 21:56
поделиться

Попробуйте что-нибудь вроде:

SELECT
    field1,
    RTRIM(REPLACE(REPLACE(XMLAgg(XMLElement("x", field2) ORDER BY field2), '<x>'), '</x>', ' ')) AS field2s
  FROM yourTable
  GROUP BY field1

На основе свободного ответа , найденного на этом форуме Oracle .

РЕДАКТИРОВАТЬ: это решение оказалось очень ресурсоемких запросов, содержащих что-то вроде 10 5 строк. В итоге я заменил это настраиваемыми агрегатными функциями, как , предложенными Джоном .

5
ответ дан 27 November 2019 в 21:56
поделиться

В 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

См. Эту статью в моем блоге для объяснения:

9
ответ дан 27 November 2019 в 21:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: