Oracle7: данные слияния во многих записях совпадают с одной записью - PullRequest
0 голосов
/ 17 марта 2011

Я хотел бы объединить данные во многих записях в одну запись.От

       FO                 LINE  FLOOR   COLOR   SUM
    S4714EH02               EH  11F         AK  9
    S4714EH02               EH  11F         AK  18
    S4714EH02               EH  11F         FE  9
    S4714EH02               EH  11F         FE  18
    S4714EH02               EH  12F         AK  9
    S4714EH02               EH  12F         AK  18
    S4714EH02               EH  12F         FE  9
    S4714EH02               EH  12F         FE  18

До

  FO                   LINE FLOOR       COLOR   SUM
  S4714EH02             EH  11F         AK  9,18
  S4714EH02             EH  11F         FE  9,18
  S4714EH02             EH  12F         AK  9,18
  S4714EH02             EH  12F         FE  9,18

Я знаю, что это возможно в SQL Server 2008, но я не знаю, что это можно сделать в oracle7.Пожалуйста, помогите мне.Спасибо.

Ответы [ 3 ]

3 голосов
/ 17 марта 2011

Как уже очень хорошо сказал APC, эта версия действительно старая и не имеет всевозможных функций для агрегирования строк. Я работал с версией 7 в предыдущем тысячелетии, и я думаю, что следующая последовательность должна работать в Oracle7. Хотя я могу ошибаться, но, очевидно, я не могу это проверить.

SQL> create table t (fo,line,floor,color,sum)
  2  as
  3  select 'S4714EH02', 'EH', '11F', 'AK', 9 from dual union all
  4  select 'S4714EH02', 'EH', '11F', 'AK', 18 from dual union all
  5  select 'S4714EH02', 'EH', '11F', 'FE', 9 from dual union all
  6  select 'S4714EH02', 'EH', '11F', 'FE', 18 from dual union all
  7  select 'S4714EH02', 'EH', '12F', 'AK', 9 from dual union all
  8  select 'S4714EH02', 'EH', '12F', 'AK', 18 from dual union all
  9  select 'S4714EH02', 'EH', '12F', 'FE', 9 from dual union all
 10  select 'S4714EH02', 'EH', '12F', 'FE', 18 from dual
 11  /

Table created.

SQL> create function f
  2  ( p_fo    in t.fo%type
  3  , p_line  in t.line%type
  4  , p_floor in t.floor%type
  5  , p_color in t.color%type
  6  ) return varchar2
  7  is
  8    cursor c
  9    is
 10    select t.sum
 11      from t
 12     where t.fo = p_fo
 13       and t.line = p_line
 14       and t.floor = p_floor
 15       and t.color = p_color
 16     order by t.sum
 17    ;
 18    l_concatenated_sum varchar2(2000);
 19  begin
 20    for r in c
 21    loop
 22      l_concatenated_sum := l_concatenated_sum || ',' || to_char(r.sum);
 23    end loop;
 24    return substr(l_concatenated_sum,2);
 25  end f;
 26  /

Function created.

SQL> select fo
  2       , line
  3       , floor
  4       , color
  5       , f(fo,line,floor,color) sum
  6    from t
  7   group by fo
  8       , line
  9       , floor
 10       , color
 11  /

FO        LI FLO CO SUM
--------- -- --- -- --------------------
S4714EH02 EH 11F AK 9,18
S4714EH02 EH 11F FE 9,18
S4714EH02 EH 12F AK 9,18
S4714EH02 EH 12F FE 9,18

4 rows selected.

С уважением,
Роб.

2 голосов
/ 17 марта 2011

Oracle 7 - прекрасный выпуск этой базы данных. он ввел много новых функций, он работал хорошо и, очевидно, остается чрезвычайно стабильным. Но это долго в зубе и не хватает многих функций, доступных для нас в более поздних версиях продукта.

Например, все обычные методы, которые мы можем использовать для объединения значений в список, работают только в 9i или выше. (Некоторые могут работать в 8i, мой разум здесь немного размыт, поскольку прошло уже почти десять лет с тех пор, как я работал с Oracle в том старом возрасте)

Так есть ли у вас какие-либо опции в Oracle 7? Единственное, о чем я могу подумать, - это запустить хранимую процедуру как часть предварительной обработки отчетов. Эта хранимая процедура будет зацикливать строки, которые вы хотите запросить, собирать строки, которые соответствуют желаемому результату, и затем вставлять их в другую таблицу. Эта таблица будет затем обслуживать фактический запрос.

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

0 голосов
/ 17 марта 2011

В особом случае, когда у вас есть только две записи для каждого отдельного ключа - как показано вашими примерами данных - вы можете сделать это:

SELECT fo, line, floor, color, MIN(sum) || ',' || MAX(sum)
  FROM theTable
  GROUP BY fo, line, floor, color;

Но это не может быть обобщено для обработки большего количествачем два значения sum на ключ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...