我将试着用一个例子来解释这个问题。我有一张table:xxtb_je_txn
CREATE TABLE XXTB_JE_TXN
( "ENTITY" VARCHAR2(10 BYTE),
"JE_HEADER_ID" VARCHAR2(1000 BYTE),
"NET_CR" NUMBER,
"NET_DR" NUMBER
);
Insert into XXTB_JE_TXN (ENTITY,JE_HEADER_ID,NET_CR,NET_DR) values ('401','10101',0,30);
Insert into XXTB_JE_TXN (ENTITY,JE_HEADER_ID,NET_CR,NET_DR) values ('302','10101',0,20);
Insert into XXTB_JE_TXN (ENTITY,JE_HEADER_ID,NET_CR,NET_DR) values ('402','10101',0,50);
Insert into XXTB_JE_TXN (ENTITY,JE_HEADER_ID,NET_CR,NET_DR) values ('301','10101',100,0);
Insert into XXTB_JE_TXN (ENTITY,JE_HEADER_ID,NET_CR,NET_DR) values ('402','10102',50,0);
Insert into XXTB_JE_TXN (ENTITY,JE_HEADER_ID,NET_CR,NET_DR) values ('301','10102',0,100);
Insert into XXTB_JE_TXN (ENTITY,JE_HEADER_ID,NET_CR,NET_DR) values ('401','10102',30,0);
Insert into XXTB_JE_TXN (ENTITY,JE_HEADER_ID,NET_CR,NET_DR) values ('302','10102',20,0);
Insert into XXTB_JE_TXN (ENTITY,JE_HEADER_ID,NET_CR,NET_DR) values ('102','10103',0,400.44);
Insert into XXTB_JE_TXN (ENTITY,JE_HEADER_ID,NET_CR,NET_DR) values ('101','10103',992.57,325.17);
Insert into XXTB_JE_TXN (ENTITY,JE_HEADER_ID,NET_CR,NET_DR) values ('201','10103',0,266.96);
Insert into XXTB_JE_TXN (ENTITY,JE_HEADER_ID,NET_CR,NET_DR) values ('102','10105',62.5,0);
Insert into XXTB_JE_TXN (ENTITY,JE_HEADER_ID,NET_CR,NET_DR) values ('201','10105',0,17291);
Insert into XXTB_JE_TXN (ENTITY,JE_HEADER_ID,NET_CR,NET_DR) values ('101','10105',17228.5,0);
Insert into XXTB_JE_TXN (ENTITY,JE_HEADER_ID,NET_CR,NET_DR) values ('204','10104',200,0);
Insert into XXTB_JE_TXN (ENTITY,JE_HEADER_ID,NET_CR,NET_DR) values ('101','10104',0,200);
它看起来像这样:
| 实体|JE_HEADER_ID| NET_CR| NET_DR|
| - -----|- -----|- -----|- -----|
| 四零一|10101| 0|三十|
| 三百零二|10101| 0|二十个|
| 四零二|10101| 0|五十|
| 三百零一|10101|一百|0|
| 四零二|10102|五十|0|
| 三百零一|10102| 0|一百|
| 四零一|10102|三十|0|
| 三百零二|10102|二十个|0|
| 一百零二|10103| 0|四百零四|
| 一百零一|10103|九百九十二点五七|三百二十五点一七|
| 二百零一|10103| 0|二百六十六点九六|
| 一百零二|10105|六十二点五|0|
| 二百零一|10105| 0| 17291|
| 一百零一|10105| 17228.5| 0|
| 二百零四|10104|两百|0|
| 一百零一|10104| 0|两百|
我想拆分行以创建余额条目,如:
| 实体|JE_HEADER_ID| NET_CR| NET_DR|
| - -----|- -----|- -----|- -----|
| 四零一|10101| 0|三十|
| 三百零二|10101| 0|二十个|
| 四零二|10101| 0|五十|
| 三百零一|10101|三十|0|
| 三百零一|10101|二十个|0|
| 三百零一|10101|五十|0|
| 四零二|10102|五十|0|
| 三百零一|10102| 0|五十|
| 三百零一|10102| 0|三十|
| 三百零一|10102| 0|二十个|
| 四零一|10102|三十|0|
| 三百零二|10102|二十个|0|
| 一百零二|10103| 0|四百零四|
| 一百零一|10103|四百零四|0|
| 一百零一|10103|二百六十六点九六|0|
| 二百零一|10103| 0|二百六十六点九六|
| 一百零二|10105|六十二点五|0|
| 二百零一|10105| 0| 17228.5|
| 二百零一|10105| 0|六十二点五|
| 一百零一|10105| 17228.5| 0|
| 二百零四|10104|两百|0|
| 一百零一|10104| 0|两百|
如何做到这一点?
我试过了。
select s1.entity,
s1.je_header_id,
nvl(l.net_cr,s1.net_cr) net_cr,
nvl(l.net_dr,s1.net_dr) net_dr
from XXTB_JE_TXN s1,
lateral(
select s2.net_dr net_cr,
s2.net_cr net_dr
from XXTB_JE_TXN s2
where s2.je_header_id = s1.je_header_id
and s1.net_cr != 0
and s2.net_cr = 0
)(+) l
order by je_header_id,
net_cr;
JE_HEADER_ID的输出错误:10102和10105
| 实体|JE_HEADER_ID| NET_CR| NET_DR|
| - -----|- -----|- -----|- -----|
| 四零一|10101| 0|三十|
| 三百零二|10101| 0|二十个|
| 四零二|10101| 0|五十|
| 三百零一|10101|三十|0|
| 三百零一|10101|二十个|0|
| 三百零一|10101|五十|0|
| 三百零一|10102| 0|一百|
| 三百零二|10102|一百|0|
| 四零二|10102|一百|0|
| 四零一|10102|一百|0|
| 一百零二|10103| 0|四百零四|
| 一百零一|10103|四百零四|0|
| 一百零一|10103|二百六十六点九六|0|
| 二百零一|10103| 0|二百六十六点九六|
| 二百零一|10105| 0| 17291|
| 一百零二|10105| 17291| 0|
| 一百零一|10105| 17291| 0|
我尝试了这个方法,但也产生了错误的结果:
SELECT
c.entity,
c.je_header_id,
CASE
WHEN c.net_cr = 0 THEN
0
ELSE
d.net_dr
END AS net_cr,
CASE
WHEN c.net_cr = 0 THEN
c.net_dr
ELSE
0
END AS net_dr
FROM
xxtb_je_txn c
JOIN xxtb_je_txn d ON d.je_header_id = c.je_header_id
AND sign(d.net_cr) <> sign(c.net_cr)
ORDER BY
je_header_id,
net_cr;
3条答案
按热度按时间tjvv9vkg1#
我假设这是正确的平衡,对于每个JE_HEADER_ID total cr == total dr。此外,对于每个JE_HEADER_ID,仅存在一个总计cr/dr行。将合计行替换为其非合计组件。
db-fiddle
bpzcxfmw2#
试试这个:
i2byvkas3#
实际上,缺少“交换的”CR/DR行: