我有一张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);
Insert into XXTB_JE_TXN (ENTITY,JE_HEADER_ID,NET_CR,NET_DR) values ('301','10106',70,0);
Insert into XXTB_JE_TXN (ENTITY,JE_HEADER_ID,NET_CR,NET_DR) values ('302','10106',30,0);
Insert into XXTB_JE_TXN (ENTITY,JE_HEADER_ID,NET_CR,NET_DR) values ('401','10106',0,60);
Insert into XXTB_JE_TXN (ENTITY,JE_HEADER_ID,NET_CR,NET_DR) values ('402','10106',0,40);
它看起来像这样:
| 实体|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|两百|
| 三百零一|10106|七十|0|
| 三百零二|10106|三十|0|
| 四零一|10106| 0|六十|
| 四零二|10106| 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|两百|
对于JE_HEADER_ID = 10106的行,实体之间没有net_cr和net_dr的明确关联。所以query应该忽略这些行并像这样标记它们。
| 实体|JE_HEADER_ID| NET_CR| NET_DR|错误|
| - -----|- -----|- -----|- -----|- -----|
| 三百零一|10106|七十|0|拒收|
| 三百零二|10106|三十|0|拒收|
| 四零一|10106| 0|六十|拒收|
| 四零二|10106| 0|四十|拒收|
如何做到这一点?
@Serg提供的查询很有帮助,但它不包括JE_HEADER_ID为10104的行,因为我在最初的问题中没有提到这些行。这个解决方案对最初的问题很有效。因此,我用所有必要的假设重新表述了这个问题(两组新的行,JE_HEADER_ID为10104和10106)。
with t as (
select ENTITY,JE_HEADER_ID, greatest(0, NET_CR-NET_DR)NET_CR, greatest(0, NET_DR-NET_CR) NET_DR
, sum(greatest(0, NET_CR-NET_DR)) over(partition by JE_HEADER_ID) tot
from XXTB_JE_TXN
)
select a.*
from t
cross join lateral (
select t.ENTITY,t.JE_HEADER_ID,t2.NET_CR,t2.NET_DR
from t t2
where t2.JE_HEADER_ID = t.JE_HEADER_ID and t2.tot != t2.NET_CR and t2.tot != t2.NET_DR
) a
where t.tot = t.NET_CR or t.tot = t.NET_DR
union all
select ENTITY,JE_HEADER_ID,NET_DR,NET_CR
from t
where t.tot != t.NET_CR and t.tot != t.NET_DR
order by 2, 1;
3条答案
按热度按时间dba5bblo1#
您可以用途:
对于您的示例数据,输出:
| 实体|JE_HEADER_ID| NET_CR| NET_DR|注意事项|
| - -----|- -----|- -----|- -----|- -----|
| 三百零一|10101|二十个|联系我们|接受|
| 三百零二|10101|联系我们|二十个|接受|
| 三百零一|10101|三十|联系我们|接受|
| 四零一|10101|联系我们|三十|接受|
| 三百零一|10101|五十|联系我们|接受|
| 四零二|10101|联系我们|五十|接受|
| 三百零二|10102|二十个|联系我们|接受|
| 三百零一|10102|联系我们|二十个|接受|
| 四零一|10102|三十|联系我们|接受|
| 三百零一|10102|联系我们|三十|接受|
| 四零二|10102|五十|联系我们|接受|
| 三百零一|10102|联系我们|五十|接受|
| 一百零一|10103|二百六十六点九六|联系我们|接受|
| 二百零一|10103|联系我们|二百六十六点九六|接受|
| 一百零一|10103|四百零四|联系我们|接受|
| 一百零二|10103|联系我们|四百零四|接受|
| 二百零四|10104|两百|联系我们|接受|
| 一百零一|10104|联系我们|两百|接受|
| 一百零二|10105|六十二点五|联系我们|接受|
| 二百零一|10105|联系我们|六十二点五|接受|
| 一百零一|10105| 17228.5|联系我们|接受|
| 二百零一|10105|联系我们|17228.5|接受|
| 三百零二|10106|三十|联系我们|拒收|
| 四零二|10106|联系我们|四十|拒收|
| 三百零一|10106|七十|联系我们|拒收|
| 四零一|10106|联系我们|六十|拒收|
fiddle
g2ieeal72#
我的尝试。测试你的输入,它显示正确的结果。它类似于匹配交易的查询,除了用于 rejected 行的额外逻辑:
dbfiddle demo
pcrecxhr3#
其中一个选择是使用MODEL Clause,它非常有用,可靠和快速。它的工作原理很像Excel工作表。因此,当您需要处理不同的行或列集或数据集中的单个单元格时,它可能是一个很好的选择。有了提供的数据,我创建了一个cte(网格)来准备数据集。
...然后使用MODEL Clause得到结果...