【问题标题】:Oracle - LISTAGG and ordering fields separated by pipe; order messed upOracle - LISTAGG 和排序字段由管道分隔;订单搞砸了
【发布时间】:2019-11-01 19:14:41
【问题描述】:

一张表有3个字段需要解析;需要将列连接在一起并按字母/数字排序。当在第一列(字母)上使用 LISTAGG 时,它对它们进行了很好的排序,但是在其他列上使用 LISTAGG 时,它们也按字母/数字排序。问题是这些列(2 和 3)不再绑定到第一列,因为所有列都使用 LISTAGG 每列单独排序

我需要第二列和第三列保持绑定到第一列,但第一列必须按字母顺序排序。第二列和第三列必须在第一列之后。

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 中的值(即自行车值是 750 和 750,但正确的值是 1500 和 1500,如上面第一个输出中所列

【问题讨论】:

  • 我很困惑...如果您只是想以相同的方式对结果进行排序,为什么不按相同的值对所有 listagg 语句进行排序呢?例如,如果您希望它按cat 排序,为什么您的第二列会有order by debit
  • create table JRNL ( cat varchar2 (25), cat_type varchar2 (25), debit varchar2 (15), credit varchar2 (15) );
  • 你的权利..它是星期五!
  • 我该如何接受你的回答..fricken ICON 在哪里
  • 你的答案在哪里,我可以接受

标签: oracle sorting listagg


【解决方案1】:

如果我明白你在说什么,所有LISTAGGs 应该使用相同的顺序 by: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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多