Oracle - LISTAGG 和排序字段由竖线分隔;订单搞砸了
Oracle - LISTAGG and ordering fields separated by pipe; order messed up
三个字段合一table需要解析;需要将列通过管道连接在一起并排序 alphabetically/numerically。当在第一列(字母)上使用 LISTAGG 时,它们会很好地排序,但是当在其他列上使用 LISTAGG 时,它们也会被排序 alphabetically/numerically。问题是这些列(2 和 3)不再绑定到第一列,因为所有列都使用每列 LISTAGG 单独排序
我需要第二列和第三列与第一列保持绑定,但第一列必须按字母顺序排序。第二列和第三列必须在第一列之后。
Oracle 12g 和 table 数据类型无法更改:
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
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
三个字段合一table需要解析;需要将列通过管道连接在一起并排序 alphabetically/numerically。当在第一列(字母)上使用 LISTAGG 时,它们会很好地排序,但是当在其他列上使用 LISTAGG 时,它们也会被排序 alphabetically/numerically。问题是这些列(2 和 3)不再绑定到第一列,因为所有列都使用每列 LISTAGG 单独排序
我需要第二列和第三列与第一列保持绑定,但第一列必须按字母顺序排序。第二列和第三列必须在第一列之后。
Oracle 12g 和 table 数据类型无法更改:
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
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