Oracle / SQL - несколько записей в одну [агрегация строк] - PullRequest
0 голосов
/ 23 февраля 2012

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

Итак, с учетом таблицы, подобной этой

REGION  CITY    SID
-------------------
1   Chicago     1234
1   Palatine    567
1   Algonquin   234
1   Wauconda    987

Я хотел бы увидеть одну запись со столбцом, другие столбцы, например регион, в порядке, но один столбец, подобный этому,

<option value="1234">Chicago</option><option value="567">Palatine</option><option value="234">Algonquin</option><option value="987">Wauconda</option>

Есть мысли о том, как это сделать?Я использую Oracle 9i и не могу сделать это в PL / SQL


Хорошо, формат таблицы немного изменился, но идея та же

COUNTRY STORECODE   STORE_NAME
------------------------------
USA     1234        Chicago
USA     567         Palatine
CAN     987         Toronto

Итак, я нашелэтот код проходит по ссылкам, перечисленным

SELECT COUNTRY,
       LTRIM(MAX(SYS_CONNECT_BY_PATH(STORECODE,','))
       KEEP (DENSE_RANK LAST ORDER BY curr),',') AS COUNTRY_HTML
FROM   (SELECT COUNTRY,
               STORECODE,
               ROW_NUMBER() OVER (PARTITION BY COUNTRY ORDER BY STORECODE) AS curr,
               ROW_NUMBER() OVER (PARTITION BY COUNTRY ORDER BY STORECODE) -1 AS prev
        FROM   tablename)
GROUP BY COUNTRY
CONNECT BY prev = PRIOR curr AND COUNTRY = PRIOR COUNTRY
START WITH curr = 1;

И когда я запускаю его, я вижу этот вывод

COUNTRY COUNTRY_HTML
--------------------
USA     1234,567
CAN     987

Я думал просто о том, чтобы сделать внутренний выбор из другого выбора, где я делаюмой конкат STORECODE и STORE_NAME вместе с html-кодом, который требуется вот так ...

SELECT COUNTRY,
       LTRIM(MAX(SYS_CONNECT_BY_PATH(RECORD_HTML,','))
       KEEP (DENSE_RANK LAST ORDER BY curr),',') AS COUNTRY_HTML
FROM   (SELECT COUNTRY,
               RECORD_HTML,
               ROW_NUMBER() OVER (PARTITION BY COUNTRY ORDER BY RECORD_HTML) AS curr,
               ROW_NUMBER() OVER (PARTITION BY COUNTRY ORDER BY RECORD_HTML) -1 AS prev
        FROM   (SELECT COUNTRY, '<option value="' || STORECODE || '">' || STORE_NAME || '</option>' AS RECORD_HTML FROM tablename))
GROUP BY COUNTRY
CONNECT BY prev = PRIOR curr AND COUNTRY = PRIOR COUNTRY
START WITH curr = 1;

Хотя наша интерфейсная среда принимает запрос, когда я пытаюсь просмотреть результаты, я получаю сообщение об ошибке: ресурснедействительным.Возможно, вам придется заново создать запрос на исправление перед просмотром.

Я знаю, что ошибка, вероятно, бесполезна, но есть идеи, почему моя версия не работает?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 23 февраля 2012

Это отвратительно, но вы могли бы сделать что-то вроде этого:

select replace(blah2,',','')
  from ( select wm_concat(blah) as blah2
           from ( select '<option value="' || sid || '">' || city || '</option>' as blah
                    from my_table
                         )
                 )
0 голосов
/ 23 февраля 2012

Играли ли вы с DBMS_XMLGEN?

0 голосов
/ 23 февраля 2012

Вы можете создать агрегатную функцию в Oracle, см. Документацию.

...