Построитель отчетов 2.0 или агрегация строк Oracle - PullRequest
0 голосов
/ 01 марта 2010

В построителе отчетов 2.0 я пытаюсь создать таблицу с данными, подобными приведенным ниже:

Person | StrID's
-------------------
Jim    | a, b, c, d
Mary   | h, k
Sue    | l, m, p, z

Проблема в том, что мой запрос Oracle SQL возвращает данные в следующем формате:

Person | StrID
--------------
Jim    | a
Jim    | b
Jim    | c
Jim    | d
Mary   | h

И так далее. У меня нет доступа в Oracle для использования LISTAGG, как описано в этого учебного пособия , и я не могу использовать EXPLAIN PLAN или сказать, какую версию Oracle я использую, потому что мне нужен доступ к базе данных через очень ограниченный интерфейс. Я посмотрел на функции построителя отчетов, например Aggregate, но не могу найти способ объединить несколько строковых значений вместе с агрегатной функцией. Если я создаю группировку таблицы по Person, я получаю отдельные строки для каждого из StrID. Использование Join(Fields!StrID.Value, ", ") приводит к тому, что "#Error" отображается в ячейке таблицы, я предполагаю, что Fields!StrID.Value на самом деле не является многозначным полем, это одно значение на человека.

Может кто-нибудь сказать мне способ показать список связанных StrID по Person в одной строке, либо через SQL или построитель отчетов 2.0 / Visual Basic?

Редактировать: Я могу использовать функцию LAG , если кто-нибудь может придумать креативное решение с использованием этого. Оказывается, я могу использовать PARTITION BY вместе с функцией LAG.

Ответы [ 3 ]

1 голос
/ 02 марта 2010

Здесь http://www.sqlsnippets.com/en/topic-11787.html у них есть как минимум 10 методов, некоторые из которых не требуют создания дополнительных объектов. Вы можете попробовать любой из них, чтобы убедиться, что они подходят к вашей версии Oracle.

0 голосов
/ 02 марта 2010

Узнав, что функция LAG работает, я подумал, что смогу получить StrID и предыдущую строку StrID, объединить их вместе, а затем каким-то образом продолжать делать это для всех строк для Person. Я нашел этот вопрос AskTom и смог адаптировать его для работы с моими таблицами:

SELECT Person, 
       SUBSTR(
         MAX(list) KEEP (DENSE_RANK FIRST ORDER BY lev DESC),
         2
       ) AS StrIDs
FROM ( 
       SELECT Person,
              SYS_CONNECT_BY_PATH(StrID, ', ') AS list,
              LEVEL AS lev
       FROM (
              SELECT Person,
                     StrID,
                     LAG(StrID, 1)
                       OVER (PARTITION BY Person ORDER BY StrID) AS prev_id
              FROM my_table
              WHERE other_conditions = 'blah blah'
            )
       START WITH prev_id IS NULL
       CONNECT BY PRIOR StrID=prev_id
     )
GROUP BY Person
ORDER BY Person

Теперь я получаю данные в ожидаемом формате, а именно:

Person StrIDs
jeff   a, b, c
linda  k, l, m
0 голосов
/ 01 марта 2010

Я смотрел сайт Тома Кайта ? Если вы ищете «pivot», результаты могут быть полезны.

, например

http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:124812348063

или

http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:15151874723724

К сожалению, у меня нет доступа к отчетам 2.0 (К счастью (?) Я начал с 6i!), Поэтому я не могу подтвердить, что это будет работать в вашей среде.

...