Oracle - LISTAGG и поля заказа, разделенные конвейером;заказ испорчен - PullRequest
0 голосов
/ 01 ноября 2019

В одной таблице три поля, которые необходимо проанализировать;Нужны столбцы, соединенные вместе и отсортированные по алфавиту / по номерам. При использовании LISTAGG в первом столбце (в алфавитном порядке) они сортируются нормально, но при использовании LISTAGG в других столбцах они также сортируются по алфавиту / по номерам. Проблема заключается в том, что эти столбцы (2 и 3) больше не привязаны к первому столбцу, поскольку все столбцы сортируются по отдельности, используя LISTAGG на столбец

Мне нужны столбцы два и три, чтобы оставаться привязанными к первым столбцам, ноПервый столбец должен быть отсортирован по алфавиту. Столбцы два и три должны следовать за столбцом 1.

Oracle 12g и тип данных таблицы не может быть изменен:

create table JRNL (
cat       varchar2(25),
cat_type  varchar2(25),
debit     varchar2(15),
credit    varchar2(15)
);

insert into JRNL (CAT_TYPE, CAT, DEBIT, CREDIT) values ('2', 'Car', '800', '5000');
insert into JRNL (CAT_TYPE, CAT, DEBIT, CREDIT) values ('2', 'Trucks', '1700', '1700');
insert into JRNL (CAT_TYPE, CAT, DEBIT, CREDIT) values ('2', 'Motorcycle', '750', '750');
insert into JRNL (CAT_TYPE, CAT, DEBIT, CREDIT) values ('2', 'Bikes', '1500', '1500');

SQL ниже столбцов списка в правильном порядке и значения:

CAT              Debit             Credit
Bikes            1,500.00          1,500.00
Car              800.00            5,000.00
Motorcycle       750.00            750.00
Trucks           1,700.00          1,700.00

Использовал LISTAGG для объединения полей вместе, но теперь поля не совпадают?

SELECT LISTAGG(Cat, '|') WITHIN GROUP (ORDER BY Cat) Cat,
       LISTAGG(to_char(Debit,'999,999,999,999.99'), '|') WITHIN GROUP (ORDER BY Debit) Debit,
       LISTAGG(to_char(Credit,'999,999,999,999.99'), '|') WITHIN GROUP (ORDER BY Credit) Credit
FROM   (
         SELECT Cat, SUM(Debit) Debit, SUM(Credit) Credit
         FROM   jrnl
         WHERE  cat_type = 2
         GROUP BY Cat
       )
ORDER BY Cat

Результат:

CAT                            Debit                             Credit
Bikes|Car|Motorcycle|Trucks    750.00|800.00|1,500.00|1,700.00   750.00|1,500.00|1,700.00|5,000.00

примечание Значения дебета и кредита больше не соответствуют значениям в Cat (то есть значения Bike 750 и 750, а правильные значения 1500 и 1500, как указано в первом выводе выше

1 Ответ

0 голосов
/ 01 ноября 2019

Если я понял, что вы говорите, все LISTAGG s должны использовать один и тот же порядок: cat

  LISTAGG(Cat, '|') WITHIN GROUP                                  (ORDER BY Cat) Cat,
  LISTAGG(to_char(Debit,'999,999,999,999.99'), '|') WITHIN GROUP  (ORDER BY cat) Debit,
  LISTAGG(to_char(Credit,'999,999,999,999.99'), '|') WITHIN GROUP (ORDER BY cat) Credit
                                                                   ------------
                                                                    This
...