Sql 当满足条件时,仅消除总和为0的值
我目前有一个查询,它工作得很好,结果都是正确的,但是需要修改以删除带有特定VOT和匹配VONO的未使用行 当前,查询将返回如下结果集 样本1Sql 当满足条件时,仅消除总和为0的值,sql,oracle,Sql,Oracle,我目前有一个查询,它工作得很好,结果都是正确的,但是需要修改以删除带有特定VOT和匹配VONO的未使用行 当前,查询将返回如下结果集 样本1 PART_NO TRANSACTION YEAR QUANTITY INV_COST PARTSDESCRIPTION COMPANY VONO TEXT YEAR_PERIOD_KEY ACCOUNT ACC CODE_B CODE_B_DESC CODE_C CODE_C_
PART_NO TRANSACTION YEAR QUANTITY INV_COST PARTSDESCRIPTION COMPANY VONO TEXT YEAR_PERIOD_KEY ACCOUNT ACC CODE_B CODE_B_DESC CODE_C CODE_C_DESC CODE_F CODE_F_DESC REFERENCE_NUMBER VOT VOTD AMOUNT SUPPLIER_ID NAME LINE_NO OBJECT_CLASS FOCDESCRIPTION ROW_NO
10438 Issue 2015 1 12.39 coat 19 2015000314 Issue 201502 5635 Equipment 426 Floor 16 Operations null null 2869 MPL 11-FEB-15 12.39 null null null null null 2
null null 2015 null null null 19 2015000314 Automotive 201501 5513 Maintenance 426 Floor 16 Operations 80016 Mobile MI074755 J 07-JAN-15 77.82 52254 Automotive null 131100 Mobile 2
null Reg 2015 1 76.5 hose 19 2015000314 Register 201502 5490 consumable 426 Floor 16 Operations E80009 Group P42085 0 03-FEB-15 76.5 null null 1 132300 Group 8
null null 2015 null null null 19 2015000314 Automotive 201501 5513 Maintenance 426 Floor 16 Operations 80016 Mobile MI074755 J 07-JAN-15 -77.82 52254 Automotive null 131100 Mobile 4
null Reg 2015 4 86.53 battery 19 2015000314 Register 201502 5430 Material 426 Floor 16 Operations E80005 Running P42092 0 03-FEB-15 346.12 null null 1 142100 Runner 10
null null 2015 null null null 19 2015000314 Automotive 201501 5513 Maintenance 426 Floor 16 Operations 80016 Mobile MI074755 J 07-JAN-15 62.44 52254 Automotive null 131100 Mobile 4
现在我要做的是,只有当VOT=J和VONO相同,并且金额相互抵消时,我不希望显示它们(在这种情况下,两个值-77.82和77.82相互抵消,因为它们是VOT=J,它们都是一个相同的VONO)
这将产生如下所示的期望输出:
PART_NO TRANSACTION YEAR QUANTITY INV_COST PARTSDESCRIPTION COMPANY VONO TEXT YEAR_PERIOD_KEY ACCOUNT ACC CODE_B CODE_B_DESC CODE_C CODE_C_DESC CODE_F CODE_F_DESC REFERENCE_NUMBER VOT VOTD AMOUNT SUPPLIER_ID NAME LINE_NO OBJECT_CLASS FOCDESCRIPTION ROW_NO
10438 Issue 2015 1 12.39 coat 19 2015000314 Issue 201502 5635 Equipment 426 Floor 16 Operations null null 2869 MPL 11-FEB-15 12.39 null null null null null 2
null Reg 2015 1 76.5 hose 19 2015000314 Register 201502 5490 consumable 426 Floor 16 Operations E80009 Group P42085 0 03-FEB-15 76.5 null null 1 132300 Group 8
null Reg 2015 4 86.53 battery 19 2015000314 Register 201502 5430 Material 426 Floor 16 Operations E80005 Running P42092 0 03-FEB-15 346.12 null null 1 142100 Runner 10
null null 2015 null null null 19 2015000314 Automotive 201501 5513 Maintenance 426 Floor 16 Operations 80016 Mobile MI074755 J 07-JAN-15 62.44 52254 Automotive null 131100 Mobile 4
当前查询是this,并给出第一个输出
SELECT DISTINCT pt.part_no, pt.TRANSACTION, g.year, pt.quantity,
(g.amount/pt.quantity) as Inv_Cost,
case when pc.description is null then p.description else pc.description end as partsdescription,
g.company, g.vono, g.text, g.year_period_key, g.acc, g.code_b, g.code_b_desc, g.code_c,
g.code_c_desc, g.code_f, g.code_f_desc, g.reference_number, g.vot, g.votd, g.amount,
s.supplier_id, s.NAME, p.line_no, foc.object_class, foc.description AS focdescription,
g.row_no
FROM gen g
LEFT OUTER JOIN phist pt ON g.accid = pt.accid
FULL OUTER JOIN partc pc ON pt.part_no = pc.part_no
LEFT OUTER JOIN pola p ON pt.order_no = p.order_no AND pt.rel = p.line_no
LEFT OUTER JOIN sia s ON g.party_type_id = s.supplier_id
LEFT OUTER JOIN cust c ON g.party_type_id = c.customer_id
LEFT OUTER JOIN inv d ON g.COMPANY = d.COMPANY AND g.vono = d.vonore AND g.vot = d.VOUCHER_TYPE_REF
LEFT OUTER JOIN III b ON d.company = b.company AND d.invid = b.invid
LEFT OUTER JOIN ob fo ON g.code_f = fo.object_id
LEFT OUTER JOIN obcl foc ON fo.object_class = foc.object_class
WHERE g.year = '2015' and g.company = '19'
AND (g.acc > '2999' OR g.acc IN ('1401','1450'))
AND g.code_b IN ('426', '028', '124', '125')
AND g.vot != 'MPL'
更新(XQbert)
好的,下面是一个(基本的)SQL小提琴:
正在发生的是,它正在删除所有VOT=J,而不仅仅是每个VONO总计为0的VOT=J
样本数据:
PART_NO TRANSACTION YEAR QUANTITY INV_COST PARTSDESCRIPTION COMPANY VONO TEXT YEAR_PERIOD_KEY ACCOUNT ACC CODE_B CODE_B_DESC CODE_C CODE_C_DESC CODE_F CODE_F_DESC REFERENCE_NUMBER VOT VOTD AMOUNT SUPPLIER_ID NAME LINE_NO OBJECT_CLASS FOCDESCRIPTION ROW_NO
10438 Issue 2015 1 12.39 coat 19 2015000314 Issue 201502 5635 Equipment 426 Floor 16 Operations null null 2869 MPL 11-FEB-15 12.39 null null null null null 2
null null 2015 null null null 19 2015000314 Automotive 201501 5513 Maintenance 426 Floor 16 Operations 80016 Mobile MI074755 J 07-JAN-15 77.82 52254 Automotive null 131100 Mobile 2
null Reg 2015 1 76.5 hose 19 2015000314 Register 201502 5490 consumable 426 Floor 16 Operations E80009 Group P42085 0 03-FEB-15 76.5 null null 1 132300 Group 8
null null 2015 null null null 19 2015000314 Automotive 201501 5513 Maintenance 426 Floor 16 Operations 80016 Mobile MI074755 J 07-JAN-15 -77.82 52254 Automotive null 131100 Mobile 4
null Reg 2015 4 86.53 battery 19 2015000314 Register 201502 5430 Material 426 Floor 16 Operations E80005 Running P42092 0 03-FEB-15 346.12 null null 1 142100 Runner 10
null null 2015 null null null 19 2015000314 Automotive 201501 5513 Maintenance 426 Floor 16 Operations 80016 Mobile MI074755 J 07-JAN-15 62.44 52254 Automotive null 131100 Mobile 4
null null 2015 null null null 19 2015000999 Bike 201507 5699 Parts 426 Floor 16 Operations 89999 fridge MA864654 J 07-JUL-15 899.84 52254 Bike null 65222 fridge 4
输出:
PART_NO TRANSACTION YEAR QUANTITY INV_COST PARTSDESCRIPTION COMPANY VONO TEXT YEAR_PERIOD_KEY ACCOUNT ACC CODE_B CODE_B_DESC CODE_C CODE_C_DESC CODE_F CODE_F_DESC REFERENCE_NUMBER VOT VOTD AMOUNT SUPPLIER_ID NAME LINE_NO OBJECT_CLASS FOCDESCRIPTION ROW_NO
10438 Issue 2015 1 12.39 coat 19 2015000314 Issue 201502 5635 Equipment 426 Floor 16 Operations null null 2869 MPL 11-FEB-15 12.39 null null null null null 2
null Reg 2015 1 76.5 hose 19 2015000314 Register 201502 5490 consumable 426 Floor 16 Operations E80009 Group P42085 0 03-FEB-15 76.5 null null 1 132300 Group 8
null Reg 2015 4 86.53 battery 19 2015000314 Register 201502 5430 Material 426 Floor 16 Operations E80005 Running P42092 0 03-FEB-15 346.12 null null 1 142100 Runner 10
预期产出:
PART_NO TRANSACTION YEAR QUANTITY INV_COST PARTSDESCRIPTION COMPANY VONO TEXT YEAR_PERIOD_KEY ACCOUNT ACC CODE_B CODE_B_DESC CODE_C CODE_C_DESC CODE_F CODE_F_DESC REFERENCE_NUMBER VOT VOTD AMOUNT SUPPLIER_ID NAME LINE_NO OBJECT_CLASS FOCDESCRIPTION ROW_NO
10438 Issue 2015 1 12.39 coat 19 2015000314 Issue 201502 5635 Equipment 426 Floor 16 Operations null null 2869 MPL 11-FEB-15 12.39 null null null null null 2
null Reg 2015 1 76.5 hose 19 2015000314 Register 201502 5490 consumable 426 Floor 16 Operations E80009 Group P42085 0 03-FEB-15 76.5 null null 1 132300 Group 8
null Reg 2015 4 86.53 battery 19 2015000314 Register 201502 5430 Material 426 Floor 16 Operations E80005 Running P42092 0 03-FEB-15 346.12 null null 1 142100 Runner 10
null null 2015 null null null 19 2015000314 Automotive 201501 5513 Maintenance 426 Floor 16 Operations 80016 Mobile MI074755 J 07-JAN-15 62.44 52254 Automotive null 131100 Mobile 4
null null 2015 null null null 19 2015000999 Bike 201507 5699 Parts 426 Floor 16 Operations 89999 fridge MA864654 J 07-JUL-15 899.84 52254 Bike null 65222 fridge 4
未经测试的样本数据将过于复杂 这只是建立在你所做的基础上。可能有一种更简单、更优雅的方式 这样做的目的是在VoNo上生成一个公共表表达式(CTE)并将一个CTE连接到另一个CTE,并确保两个表的Vot都为J,然后对一个表中与另一个表相匹配的金额中的一个进行求反,如果它们匹配,则消除它们但是,如果同一VoNo有两个以上的量,例如额外的-75量,则会出现问题。它也将被排除在外。。。也许不是你想要的。但是如果数据不能以这种方式出现。。。没有问题。 初步答复:
With CTE AS (
SELECT DISTINCT pt.part_no, pt.TRANSACTION, g.year, pt.quantity,
(g.amount/pt.quantity) as Inv_Cost,
case when pc.description is null then p.description else pc.description end as partsdescription,
g.company, g.vono, g.text, g.year_period_key, g.acc, g.code_b, g.code_b_desc, g.code_c,
g.code_c_desc, g.code_f, g.code_f_desc, g.reference_number, g.vot, g.votd, g.amount,
s.supplier_id, s.NAME, p.line_no, foc.object_class, foc.description AS focdescription,
g.row_no
FROM gen g
LEFT OUTER JOIN phist pt ON g.accid = pt.accid
FULL OUTER JOIN partc pc ON pt.part_no = pc.part_no
LEFT OUTER JOIN pola p ON pt.order_no = p.order_no AND pt.rel = p.line_no
LEFT OUTER JOIN sia s ON g.party_type_id = s.supplier_id
LEFT OUTER JOIN cust c ON g.party_type_id = c.customer_id
LEFT OUTER JOIN inv d ON g.COMPANY = d.COMPANY AND g.vono = d.vonore AND g.vot = d.VOUCHER_TYPE_REF
LEFT OUTER JOIN III b ON d.company = b.company AND d.invid = b.invid
LEFT OUTER JOIN ob fo ON g.code_f = fo.object_id
LEFT OUTER JOIN obcl foc ON fo.object_class = foc.object_class
WHERE g.year = '2015' and g.company = '19'
AND (g.acc > '2999' OR g.acc IN ('1401','1450'))
AND g.code_b IN ('426', '028', '124', '125')
AND g.vot != 'MPL')
SELECT * from CTE MINUS
SELECT A.*
FROM CTE A
INNER JOIN CTE B
on A.VoNo=B.VoNo
WHERE A.Amount+B.Amount = 0
and A.Vot='J' and B.Vot='J'
使用添加的并集(放置并集),则cte并集结果将不起作用。cte必须在第一个,并集必须在生成的cte之后,但可以在第一个选择之前或最后一个选择之后
With CTE AS (
SELECT DISTINCT pt.part_no, pt.TRANSACTION, g.year, pt.quantity,
(g.amount/pt.quantity) as Inv_Cost,
case when pc.description is null then p.description else pc.description end as partsdescription,
g.company, g.vono, g.text, g.year_period_key, g.acc, g.code_b, g.code_b_desc, g.code_c,
g.code_c_desc, g.code_f, g.code_f_desc, g.reference_number, g.vot, g.votd, g.amount,
s.supplier_id, s.NAME, p.line_no, foc.object_class, foc.description AS focdescription,
g.row_no
FROM gen g
LEFT OUTER JOIN phist pt ON g.accid = pt.accid
FULL OUTER JOIN partc pc ON pt.part_no = pc.part_no
LEFT OUTER JOIN pola p ON pt.order_no = p.order_no AND pt.rel = p.line_no
LEFT OUTER JOIN sia s ON g.party_type_id = s.supplier_id
LEFT OUTER JOIN cust c ON g.party_type_id = c.customer_id
LEFT OUTER JOIN inv d ON g.COMPANY = d.COMPANY AND g.vono = d.vonore AND g.vot = d.VOUCHER_TYPE_REF
LEFT OUTER JOIN III b ON d.company = b.company AND d.invid = b.invid
LEFT OUTER JOIN ob fo ON g.code_f = fo.object_id
LEFT OUTER JOIN obcl foc ON fo.object_class = foc.object_class
WHERE g.year = '2015' and g.company = '19'
AND (g.acc > '2999' OR g.acc IN ('1401','1450'))
AND g.code_b IN ('426', '028', '124', '125')
AND g.vot != 'MPL')
--Could put your SELECT here
--UNION ALL
SELECT * from CTE MINUS
SELECT A.*
FROM CTE A
INNER JOIN CTE B
on A.VoNo=B.VoNo
WHERE A.Amount+B.Amount = 0
and A.Vot='J' and B.Vot='J'
--UNION ALL or here...
--YOUR UNION
未经测试的样本数据将过于复杂 这仅仅是建立在你所做的基础上。可能有一种更简单更优雅的方式 它的作用是生成一个公共表表达式(CTE)并在VoNo上将一个CTE连接到另一个CTE,并确保两个表的Vot都为J,然后对一个表与另一个表的Vot进行求反,如果它们匹配,则会消除它们。但是,如果有两个以上的金额具有相同的VoNo,例如额外的-75,则会出现问题被排除在外…可能不符合要求。但如果数据不能以这种方式出现…没有问题。 初步答复:
With CTE AS (
SELECT DISTINCT pt.part_no, pt.TRANSACTION, g.year, pt.quantity,
(g.amount/pt.quantity) as Inv_Cost,
case when pc.description is null then p.description else pc.description end as partsdescription,
g.company, g.vono, g.text, g.year_period_key, g.acc, g.code_b, g.code_b_desc, g.code_c,
g.code_c_desc, g.code_f, g.code_f_desc, g.reference_number, g.vot, g.votd, g.amount,
s.supplier_id, s.NAME, p.line_no, foc.object_class, foc.description AS focdescription,
g.row_no
FROM gen g
LEFT OUTER JOIN phist pt ON g.accid = pt.accid
FULL OUTER JOIN partc pc ON pt.part_no = pc.part_no
LEFT OUTER JOIN pola p ON pt.order_no = p.order_no AND pt.rel = p.line_no
LEFT OUTER JOIN sia s ON g.party_type_id = s.supplier_id
LEFT OUTER JOIN cust c ON g.party_type_id = c.customer_id
LEFT OUTER JOIN inv d ON g.COMPANY = d.COMPANY AND g.vono = d.vonore AND g.vot = d.VOUCHER_TYPE_REF
LEFT OUTER JOIN III b ON d.company = b.company AND d.invid = b.invid
LEFT OUTER JOIN ob fo ON g.code_f = fo.object_id
LEFT OUTER JOIN obcl foc ON fo.object_class = foc.object_class
WHERE g.year = '2015' and g.company = '19'
AND (g.acc > '2999' OR g.acc IN ('1401','1450'))
AND g.code_b IN ('426', '028', '124', '125')
AND g.vot != 'MPL')
SELECT * from CTE MINUS
SELECT A.*
FROM CTE A
INNER JOIN CTE B
on A.VoNo=B.VoNo
WHERE A.Amount+B.Amount = 0
and A.Vot='J' and B.Vot='J'
使用添加的并集(放置并集),则cte并集结果将不起作用。cte必须在第一个,并集必须在生成的cte之后,但可以在第一个选择之前或最后一个选择之后
With CTE AS (
SELECT DISTINCT pt.part_no, pt.TRANSACTION, g.year, pt.quantity,
(g.amount/pt.quantity) as Inv_Cost,
case when pc.description is null then p.description else pc.description end as partsdescription,
g.company, g.vono, g.text, g.year_period_key, g.acc, g.code_b, g.code_b_desc, g.code_c,
g.code_c_desc, g.code_f, g.code_f_desc, g.reference_number, g.vot, g.votd, g.amount,
s.supplier_id, s.NAME, p.line_no, foc.object_class, foc.description AS focdescription,
g.row_no
FROM gen g
LEFT OUTER JOIN phist pt ON g.accid = pt.accid
FULL OUTER JOIN partc pc ON pt.part_no = pc.part_no
LEFT OUTER JOIN pola p ON pt.order_no = p.order_no AND pt.rel = p.line_no
LEFT OUTER JOIN sia s ON g.party_type_id = s.supplier_id
LEFT OUTER JOIN cust c ON g.party_type_id = c.customer_id
LEFT OUTER JOIN inv d ON g.COMPANY = d.COMPANY AND g.vono = d.vonore AND g.vot = d.VOUCHER_TYPE_REF
LEFT OUTER JOIN III b ON d.company = b.company AND d.invid = b.invid
LEFT OUTER JOIN ob fo ON g.code_f = fo.object_id
LEFT OUTER JOIN obcl foc ON fo.object_class = foc.object_class
WHERE g.year = '2015' and g.company = '19'
AND (g.acc > '2999' OR g.acc IN ('1401','1450'))
AND g.code_b IN ('426', '028', '124', '125')
AND g.vot != 'MPL')
--Could put your SELECT here
--UNION ALL
SELECT * from CTE MINUS
SELECT A.*
FROM CTE A
INNER JOIN CTE B
on A.VoNo=B.VoNo
WHERE A.Amount+B.Amount = 0
and A.Vot='J' and B.Vot='J'
--UNION ALL or here...
--YOUR UNION
Oracle 11g R2架构设置:
With UnindexedValues AS (
SELECT * FROM gen
),
IndexedValues AS (
SELECT v.*,
ROW_NUMBER() OVER ( PARTITION BY VONO, VOT, AMOUNT ORDER BY VOTD ) AS AmtIdx
FROM UnindexedValues v
)
SELECT PART_NO, TRANSACTION, YEAR,
QUANTITY, INV_COST, PARTSDESCRIPTION,
COMPANY, VONO, TEXT,
YEAR_PERIOD_KEY, ACCOUNT, ACC,
CODE_B, CODE_B_DESC, CODE_C,
CODE_C_DESC, CODE_F, CODE_F_DESC,
REFERENCE_NUMBER, VOT, VOTD,
AMOUNT, SUPPLIER_ID, NAME,
LINE_NO, OBJECT_CLASS, FOCDESCRIPTION,
ROW_NO
FROM IndexedValues i
WHERE NOT EXISTS (
SELECT 'X'
FROM IndexedValues x
WHERE i.VoNo = x.VoNo
AND i.Vot = x.Vot
AND i.Vot = 'J'
AND i.Amount = -x.Amount
AND i.AmtIdx = x.AmtIdx
)
| PART_NO | TRANSACTION | YEAR | QUANTITY | INV_COST | PARTSDESCRIPTION | COMPANY | VONO | TEXT | YEAR_PERIOD_KEY | ACCOUNT | ACC | CODE_B | CODE_B_DESC | CODE_C | CODE_C_DESC | CODE_F | CODE_F_DESC | REFERENCE_NUMBER | VOT | VOTD | AMOUNT | SUPPLIER_ID | NAME | LINE_NO | OBJECT_CLASS | FOCDESCRIPTION | ROW_NO |
|---------|-------------|------|----------|----------|------------------|---------|------------|------------|-----------------|---------|-------------|--------|-------------|--------|-------------|--------|-------------|------------------|-----|-------------------------|--------|-------------|------------|---------|--------------|----------------|--------|
| (null) | Reg | 2015 | 1 | 76.5 | hose | 19 | 2015000314 | Register | 201502 | 5490 | consumable | 426 | Floor | 16 | Operations | E80009 | Group | P42085 | 0 | 03-Feb-2015 12:00:00 AM | 76.5 | (null) | (null) | 1 | 132300 | Group | 8 |
| 10438 | Issue | 2015 | 1 | 12.39 | coat | 19 | 2015000314 | Issue | 201502 | 5635 | Equipment | 426 | Floor | 16 | Operations | (null) | (null) | 2869 | MPL | 11-Feb-2015 12:00:00 AM | 12.39 | (null) | (null) | (null) | (null) | (null) | 2 |
| (null) | (null) | 2015 | (null) | (null) | (null) | 19 | 2015000999 | Bike | 201507 | 5699 | Parts | 426 | Floor | 16 | Operations | 89999 | fridge | MA864654 | J | 07-Jul-2015 12:00:00 AM | 899.84 | 52254 | Bike | (null) | 65222 | fridge | 4 |
| (null) | (null) | 2015 | (null) | (null) | (null) | 19 | 2015000314 | Automotive | 201501 | 5513 | Maintenance | 426 | Floor | 16 | Operations | 80016 | Mobile | MI074755 | J | 07-Jan-2015 12:00:00 AM | 62.44 | 52254 | Automotive | (null) | 131100 | Mobile | 4 |
| (null) | Reg | 2015 | 4 | 86.53 | battery | 19 | 2015000314 | Register | 201502 | 5430 | Material | 426 | Floor | 16 | Operations | E80005 | Running | P42092 | 0 | 03-Feb-2015 12:00:00 AM | 346.12 | (null) | (null) | 1 | 142100 | Runner | 10 |
| (null) | (null) | 2015 | (null) | (null) | (null) | 19 | 2015000314 | Automotive | 201501 | 5513 | Maintenance | 426 | Floor | 16 | Operations | 80016 | Mobile | MI074755 | J | 07-Jan-2015 12:00:00 AM | 100 | 52254 | Automotive | (null) | 131100 | Mobile | 4 |
我在您的数据中添加了3行—两行为+100金额,一行为-100金额,以表明这可以处理数量不等的正数行和负数行。(并且还将amount
列更改为NUMBER(10,2)
)
查询1:
With UnindexedValues AS (
SELECT * FROM gen
),
IndexedValues AS (
SELECT v.*,
ROW_NUMBER() OVER ( PARTITION BY VONO, VOT, AMOUNT ORDER BY VOTD ) AS AmtIdx
FROM UnindexedValues v
)
SELECT PART_NO, TRANSACTION, YEAR,
QUANTITY, INV_COST, PARTSDESCRIPTION,
COMPANY, VONO, TEXT,
YEAR_PERIOD_KEY, ACCOUNT, ACC,
CODE_B, CODE_B_DESC, CODE_C,
CODE_C_DESC, CODE_F, CODE_F_DESC,
REFERENCE_NUMBER, VOT, VOTD,
AMOUNT, SUPPLIER_ID, NAME,
LINE_NO, OBJECT_CLASS, FOCDESCRIPTION,
ROW_NO
FROM IndexedValues i
WHERE NOT EXISTS (
SELECT 'X'
FROM IndexedValues x
WHERE i.VoNo = x.VoNo
AND i.Vot = x.Vot
AND i.Vot = 'J'
AND i.Amount = -x.Amount
AND i.AmtIdx = x.AmtIdx
)
| PART_NO | TRANSACTION | YEAR | QUANTITY | INV_COST | PARTSDESCRIPTION | COMPANY | VONO | TEXT | YEAR_PERIOD_KEY | ACCOUNT | ACC | CODE_B | CODE_B_DESC | CODE_C | CODE_C_DESC | CODE_F | CODE_F_DESC | REFERENCE_NUMBER | VOT | VOTD | AMOUNT | SUPPLIER_ID | NAME | LINE_NO | OBJECT_CLASS | FOCDESCRIPTION | ROW_NO |
|---------|-------------|------|----------|----------|------------------|---------|------------|------------|-----------------|---------|-------------|--------|-------------|--------|-------------|--------|-------------|------------------|-----|-------------------------|--------|-------------|------------|---------|--------------|----------------|--------|
| (null) | Reg | 2015 | 1 | 76.5 | hose | 19 | 2015000314 | Register | 201502 | 5490 | consumable | 426 | Floor | 16 | Operations | E80009 | Group | P42085 | 0 | 03-Feb-2015 12:00:00 AM | 76.5 | (null) | (null) | 1 | 132300 | Group | 8 |
| 10438 | Issue | 2015 | 1 | 12.39 | coat | 19 | 2015000314 | Issue | 201502 | 5635 | Equipment | 426 | Floor | 16 | Operations | (null) | (null) | 2869 | MPL | 11-Feb-2015 12:00:00 AM | 12.39 | (null) | (null) | (null) | (null) | (null) | 2 |
| (null) | (null) | 2015 | (null) | (null) | (null) | 19 | 2015000999 | Bike | 201507 | 5699 | Parts | 426 | Floor | 16 | Operations | 89999 | fridge | MA864654 | J | 07-Jul-2015 12:00:00 AM | 899.84 | 52254 | Bike | (null) | 65222 | fridge | 4 |
| (null) | (null) | 2015 | (null) | (null) | (null) | 19 | 2015000314 | Automotive | 201501 | 5513 | Maintenance | 426 | Floor | 16 | Operations | 80016 | Mobile | MI074755 | J | 07-Jan-2015 12:00:00 AM | 62.44 | 52254 | Automotive | (null) | 131100 | Mobile | 4 |
| (null) | Reg | 2015 | 4 | 86.53 | battery | 19 | 2015000314 | Register | 201502 | 5430 | Material | 426 | Floor | 16 | Operations | E80005 | Running | P42092 | 0 | 03-Feb-2015 12:00:00 AM | 346.12 | (null) | (null) | 1 | 142100 | Runner | 10 |
| (null) | (null) | 2015 | (null) | (null) | (null) | 19 | 2015000314 | Automotive | 201501 | 5513 | Maintenance | 426 | Floor | 16 | Operations | 80016 | Mobile | MI074755 | J | 07-Jan-2015 12:00:00 AM | 100 | 52254 | Automotive | (null) | 131100 | Mobile | 4 |
:
With UnindexedValues AS (
SELECT * FROM gen
),
IndexedValues AS (
SELECT v.*,
ROW_NUMBER() OVER ( PARTITION BY VONO, VOT, AMOUNT ORDER BY VOTD ) AS AmtIdx
FROM UnindexedValues v
)
SELECT PART_NO, TRANSACTION, YEAR,
QUANTITY, INV_COST, PARTSDESCRIPTION,
COMPANY, VONO, TEXT,
YEAR_PERIOD_KEY, ACCOUNT, ACC,
CODE_B, CODE_B_DESC, CODE_C,
CODE_C_DESC, CODE_F, CODE_F_DESC,
REFERENCE_NUMBER, VOT, VOTD,
AMOUNT, SUPPLIER_ID, NAME,
LINE_NO, OBJECT_CLASS, FOCDESCRIPTION,
ROW_NO
FROM IndexedValues i
WHERE NOT EXISTS (
SELECT 'X'
FROM IndexedValues x
WHERE i.VoNo = x.VoNo
AND i.Vot = x.Vot
AND i.Vot = 'J'
AND i.Amount = -x.Amount
AND i.AmtIdx = x.AmtIdx
)
| PART_NO | TRANSACTION | YEAR | QUANTITY | INV_COST | PARTSDESCRIPTION | COMPANY | VONO | TEXT | YEAR_PERIOD_KEY | ACCOUNT | ACC | CODE_B | CODE_B_DESC | CODE_C | CODE_C_DESC | CODE_F | CODE_F_DESC | REFERENCE_NUMBER | VOT | VOTD | AMOUNT | SUPPLIER_ID | NAME | LINE_NO | OBJECT_CLASS | FOCDESCRIPTION | ROW_NO |
|---------|-------------|------|----------|----------|------------------|---------|------------|------------|-----------------|---------|-------------|--------|-------------|--------|-------------|--------|-------------|------------------|-----|-------------------------|--------|-------------|------------|---------|--------------|----------------|--------|
| (null) | Reg | 2015 | 1 | 76.5 | hose | 19 | 2015000314 | Register | 201502 | 5490 | consumable | 426 | Floor | 16 | Operations | E80009 | Group | P42085 | 0 | 03-Feb-2015 12:00:00 AM | 76.5 | (null) | (null) | 1 | 132300 | Group | 8 |
| 10438 | Issue | 2015 | 1 | 12.39 | coat | 19 | 2015000314 | Issue | 201502 | 5635 | Equipment | 426 | Floor | 16 | Operations | (null) | (null) | 2869 | MPL | 11-Feb-2015 12:00:00 AM | 12.39 | (null) | (null) | (null) | (null) | (null) | 2 |
| (null) | (null) | 2015 | (null) | (null) | (null) | 19 | 2015000999 | Bike | 201507 | 5699 | Parts | 426 | Floor | 16 | Operations | 89999 | fridge | MA864654 | J | 07-Jul-2015 12:00:00 AM | 899.84 | 52254 | Bike | (null) | 65222 | fridge | 4 |
| (null) | (null) | 2015 | (null) | (null) | (null) | 19 | 2015000314 | Automotive | 201501 | 5513 | Maintenance | 426 | Floor | 16 | Operations | 80016 | Mobile | MI074755 | J | 07-Jan-2015 12:00:00 AM | 62.44 | 52254 | Automotive | (null) | 131100 | Mobile | 4 |
| (null) | Reg | 2015 | 4 | 86.53 | battery | 19 | 2015000314 | Register | 201502 | 5430 | Material | 426 | Floor | 16 | Operations | E80005 | Running | P42092 | 0 | 03-Feb-2015 12:00:00 AM | 346.12 | (null) | (null) | 1 | 142100 | Runner | 10 |
| (null) | (null) | 2015 | (null) | (null) | (null) | 19 | 2015000314 | Automotive | 201501 | 5513 | Maintenance | 426 | Floor | 16 | Operations | 80016 | Mobile | MI074755 | J | 07-Jan-2015 12:00:00 AM | 100 | 52254 | Automotive | (null) | 131100 | Mobile | 4 |
Oracle 11g R2架构设置:
With UnindexedValues AS (
SELECT * FROM gen
),
IndexedValues AS (
SELECT v.*,
ROW_NUMBER() OVER ( PARTITION BY VONO, VOT, AMOUNT ORDER BY VOTD ) AS AmtIdx
FROM UnindexedValues v
)
SELECT PART_NO, TRANSACTION, YEAR,
QUANTITY, INV_COST, PARTSDESCRIPTION,
COMPANY, VONO, TEXT,
YEAR_PERIOD_KEY, ACCOUNT, ACC,
CODE_B, CODE_B_DESC, CODE_C,
CODE_C_DESC, CODE_F, CODE_F_DESC,
REFERENCE_NUMBER, VOT, VOTD,
AMOUNT, SUPPLIER_ID, NAME,
LINE_NO, OBJECT_CLASS, FOCDESCRIPTION,
ROW_NO
FROM IndexedValues i
WHERE NOT EXISTS (
SELECT 'X'
FROM IndexedValues x
WHERE i.VoNo = x.VoNo
AND i.Vot = x.Vot
AND i.Vot = 'J'
AND i.Amount = -x.Amount
AND i.AmtIdx = x.AmtIdx
)
| PART_NO | TRANSACTION | YEAR | QUANTITY | INV_COST | PARTSDESCRIPTION | COMPANY | VONO | TEXT | YEAR_PERIOD_KEY | ACCOUNT | ACC | CODE_B | CODE_B_DESC | CODE_C | CODE_C_DESC | CODE_F | CODE_F_DESC | REFERENCE_NUMBER | VOT | VOTD | AMOUNT | SUPPLIER_ID | NAME | LINE_NO | OBJECT_CLASS | FOCDESCRIPTION | ROW_NO |
|---------|-------------|------|----------|----------|------------------|---------|------------|------------|-----------------|---------|-------------|--------|-------------|--------|-------------|--------|-------------|------------------|-----|-------------------------|--------|-------------|------------|---------|--------------|----------------|--------|
| (null) | Reg | 2015 | 1 | 76.5 | hose | 19 | 2015000314 | Register | 201502 | 5490 | consumable | 426 | Floor | 16 | Operations | E80009 | Group | P42085 | 0 | 03-Feb-2015 12:00:00 AM | 76.5 | (null) | (null) | 1 | 132300 | Group | 8 |
| 10438 | Issue | 2015 | 1 | 12.39 | coat | 19 | 2015000314 | Issue | 201502 | 5635 | Equipment | 426 | Floor | 16 | Operations | (null) | (null) | 2869 | MPL | 11-Feb-2015 12:00:00 AM | 12.39 | (null) | (null) | (null) | (null) | (null) | 2 |
| (null) | (null) | 2015 | (null) | (null) | (null) | 19 | 2015000999 | Bike | 201507 | 5699 | Parts | 426 | Floor | 16 | Operations | 89999 | fridge | MA864654 | J | 07-Jul-2015 12:00:00 AM | 899.84 | 52254 | Bike | (null) | 65222 | fridge | 4 |
| (null) | (null) | 2015 | (null) | (null) | (null) | 19 | 2015000314 | Automotive | 201501 | 5513 | Maintenance | 426 | Floor | 16 | Operations | 80016 | Mobile | MI074755 | J | 07-Jan-2015 12:00:00 AM | 62.44 | 52254 | Automotive | (null) | 131100 | Mobile | 4 |
| (null) | Reg | 2015 | 4 | 86.53 | battery | 19 | 2015000314 | Register | 201502 | 5430 | Material | 426 | Floor | 16 | Operations | E80005 | Running | P42092 | 0 | 03-Feb-2015 12:00:00 AM | 346.12 | (null) | (null) | 1 | 142100 | Runner | 10 |
| (null) | (null) | 2015 | (null) | (null) | (null) | 19 | 2015000314 | Automotive | 201501 | 5513 | Maintenance | 426 | Floor | 16 | Operations | 80016 | Mobile | MI074755 | J | 07-Jan-2015 12:00:00 AM | 100 | 52254 | Automotive | (null) | 131100 | Mobile | 4 |
我在您的数据中添加了3行—两行为+100金额,一行为-100金额,以表明这可以处理数量不等的正数行和负数行。(并且还将amount
列更改为NUMBER(10,2)
)
查询1:
With UnindexedValues AS (
SELECT * FROM gen
),
IndexedValues AS (
SELECT v.*,
ROW_NUMBER() OVER ( PARTITION BY VONO, VOT, AMOUNT ORDER BY VOTD ) AS AmtIdx
FROM UnindexedValues v
)
SELECT PART_NO, TRANSACTION, YEAR,
QUANTITY, INV_COST, PARTSDESCRIPTION,
COMPANY, VONO, TEXT,
YEAR_PERIOD_KEY, ACCOUNT, ACC,
CODE_B, CODE_B_DESC, CODE_C,
CODE_C_DESC, CODE_F, CODE_F_DESC,
REFERENCE_NUMBER, VOT, VOTD,
AMOUNT, SUPPLIER_ID, NAME,
LINE_NO, OBJECT_CLASS, FOCDESCRIPTION,
ROW_NO
FROM IndexedValues i
WHERE NOT EXISTS (
SELECT 'X'
FROM IndexedValues x
WHERE i.VoNo = x.VoNo
AND i.Vot = x.Vot
AND i.Vot = 'J'
AND i.Amount = -x.Amount
AND i.AmtIdx = x.AmtIdx
)
| PART_NO | TRANSACTION | YEAR | QUANTITY | INV_COST | PARTSDESCRIPTION | COMPANY | VONO | TEXT | YEAR_PERIOD_KEY | ACCOUNT | ACC | CODE_B | CODE_B_DESC | CODE_C | CODE_C_DESC | CODE_F | CODE_F_DESC | REFERENCE_NUMBER | VOT | VOTD | AMOUNT | SUPPLIER_ID | NAME | LINE_NO | OBJECT_CLASS | FOCDESCRIPTION | ROW_NO |
|---------|-------------|------|----------|----------|------------------|---------|------------|------------|-----------------|---------|-------------|--------|-------------|--------|-------------|--------|-------------|------------------|-----|-------------------------|--------|-------------|------------|---------|--------------|----------------|--------|
| (null) | Reg | 2015 | 1 | 76.5 | hose | 19 | 2015000314 | Register | 201502 | 5490 | consumable | 426 | Floor | 16 | Operations | E80009 | Group | P42085 | 0 | 03-Feb-2015 12:00:00 AM | 76.5 | (null) | (null) | 1 | 132300 | Group | 8 |
| 10438 | Issue | 2015 | 1 | 12.39 | coat | 19 | 2015000314 | Issue | 201502 | 5635 | Equipment | 426 | Floor | 16 | Operations | (null) | (null) | 2869 | MPL | 11-Feb-2015 12:00:00 AM | 12.39 | (null) | (null) | (null) | (null) | (null) | 2 |
| (null) | (null) | 2015 | (null) | (null) | (null) | 19 | 2015000999 | Bike | 201507 | 5699 | Parts | 426 | Floor | 16 | Operations | 89999 | fridge | MA864654 | J | 07-Jul-2015 12:00:00 AM | 899.84 | 52254 | Bike | (null) | 65222 | fridge | 4 |
| (null) | (null) | 2015 | (null) | (null) | (null) | 19 | 2015000314 | Automotive | 201501 | 5513 | Maintenance | 426 | Floor | 16 | Operations | 80016 | Mobile | MI074755 | J | 07-Jan-2015 12:00:00 AM | 62.44 | 52254 | Automotive | (null) | 131100 | Mobile | 4 |
| (null) | Reg | 2015 | 4 | 86.53 | battery | 19 | 2015000314 | Register | 201502 | 5430 | Material | 426 | Floor | 16 | Operations | E80005 | Running | P42092 | 0 | 03-Feb-2015 12:00:00 AM | 346.12 | (null) | (null) | 1 | 142100 | Runner | 10 |
| (null) | (null) | 2015 | (null) | (null) | (null) | 19 | 2015000314 | Automotive | 201501 | 5513 | Maintenance | 426 | Floor | 16 | Operations | 80016 | Mobile | MI074755 | J | 07-Jan-2015 12:00:00 AM | 100 | 52254 | Automotive | (null) | 131100 | Mobile | 4 |
:
With UnindexedValues AS (
SELECT * FROM gen
),
IndexedValues AS (
SELECT v.*,
ROW_NUMBER() OVER ( PARTITION BY VONO, VOT, AMOUNT ORDER BY VOTD ) AS AmtIdx
FROM UnindexedValues v
)
SELECT PART_NO, TRANSACTION, YEAR,
QUANTITY, INV_COST, PARTSDESCRIPTION,
COMPANY, VONO, TEXT,
YEAR_PERIOD_KEY, ACCOUNT, ACC,
CODE_B, CODE_B_DESC, CODE_C,
CODE_C_DESC, CODE_F, CODE_F_DESC,
REFERENCE_NUMBER, VOT, VOTD,
AMOUNT, SUPPLIER_ID, NAME,
LINE_NO, OBJECT_CLASS, FOCDESCRIPTION,
ROW_NO
FROM IndexedValues i
WHERE NOT EXISTS (
SELECT 'X'
FROM IndexedValues x
WHERE i.VoNo = x.VoNo
AND i.Vot = x.Vot
AND i.Vot = 'J'
AND i.Amount = -x.Amount
AND i.AmtIdx = x.AmtIdx
)
| PART_NO | TRANSACTION | YEAR | QUANTITY | INV_COST | PARTSDESCRIPTION | COMPANY | VONO | TEXT | YEAR_PERIOD_KEY | ACCOUNT | ACC | CODE_B | CODE_B_DESC | CODE_C | CODE_C_DESC | CODE_F | CODE_F_DESC | REFERENCE_NUMBER | VOT | VOTD | AMOUNT | SUPPLIER_ID | NAME | LINE_NO | OBJECT_CLASS | FOCDESCRIPTION | ROW_NO |
|---------|-------------|------|----------|----------|------------------|---------|------------|------------|-----------------|---------|-------------|--------|-------------|--------|-------------|--------|-------------|------------------|-----|-------------------------|--------|-------------|------------|---------|--------------|----------------|--------|
| (null) | Reg | 2015 | 1 | 76.5 | hose | 19 | 2015000314 | Register | 201502 | 5490 | consumable | 426 | Floor | 16 | Operations | E80009 | Group | P42085 | 0 | 03-Feb-2015 12:00:00 AM | 76.5 | (null) | (null) | 1 | 132300 | Group | 8 |
| 10438 | Issue | 2015 | 1 | 12.39 | coat | 19 | 2015000314 | Issue | 201502 | 5635 | Equipment | 426 | Floor | 16 | Operations | (null) | (null) | 2869 | MPL | 11-Feb-2015 12:00:00 AM | 12.39 | (null) | (null) | (null) | (null) | (null) | 2 |
| (null) | (null) | 2015 | (null) | (null) | (null) | 19 | 2015000999 | Bike | 201507 | 5699 | Parts | 426 | Floor | 16 | Operations | 89999 | fridge | MA864654 | J | 07-Jul-2015 12:00:00 AM | 899.84 | 52254 | Bike | (null) | 65222 | fridge | 4 |
| (null) | (null) | 2015 | (null) | (null) | (null) | 19 | 2015000314 | Automotive | 201501 | 5513 | Maintenance | 426 | Floor | 16 | Operations | 80016 | Mobile | MI074755 | J | 07-Jan-2015 12:00:00 AM | 62.44 | 52254 | Automotive | (null) | 131100 | Mobile | 4 |
| (null) | Reg | 2015 | 4 | 86.53 | battery | 19 | 2015000314 | Register | 201502 | 5430 | Material | 426 | Floor | 16 | Operations | E80005 | Running | P42092 | 0 | 03-Feb-2015 12:00:00 AM | 346.12 | (null) | (null) | 1 | 142100 | Runner | 10 |
| (null) | (null) | 2015 | (null) | (null) | (null) | 19 | 2015000314 | Automotive | 201501 | 5513 | Maintenance | 426 | Floor | 16 | Operations | 80016 | Mobile | MI074755 | J | 07-Jan-2015 12:00:00 AM | 100 | 52254 | Automotive | (null) | 131100 | Mobile | 4 |
你说的“vono是一样的”是什么意思?(和什么一样?)为什么不在你提到的条件上再添加一个where过滤器呢?所以在我展示的样本数据中,它们都是相同的vono。简言之。如果VOT=J和vono的匹配,并且它们有零个可抵消的值,那么“vono是一样的”是什么意思?(和什么一样?)为什么不在你提到的条件上再添加一个where过滤器呢?所以在我展示的示例数据中,它们都是相同的VONO。简而言之。如果VOT=J和VONO的匹配,并且它们的可执行值为零,那么它们几乎可以取消!这做的正好相反,并且只选择了我不想看到的两行。我确信我们可以用di来完成这项工作不同的方法,但因为我知道这些结果给了我们相反的结果,使用
减号操作数应该可以达到目的。这是一种开销,我确信有更好的方法,我只是还没有投入脑力。而且给定的时间表,可能没有时间。太棒了!!对样本选择进行初步测试,我现在就试试对于所有的VONO's,我很困惑为什么它会产生完全相反的结果…A.Amount*-1B.Amount应该排除它们…我的思维可能不正常…发现了一个问题…如果VOT=J没有匹配的负数,它就不会在应该有利的时候显示出来!这会产生相反的结果,并且只选择我不想看到的两行当然,我们可以用另一种方法来实现,但因为我知道这些结果给了我们相反的结果,使用减号操作数应该可以达到目的。这是一种开销,我确信有更好的方法,我只是还没有把脑力投入其中。而且给定的时间表,可能没有时间。太棒了!!初步测试对示例se有效选择,我现在将在所有VONO's上尝试它。我很困惑为什么它会产生完全相反的结果…A.Amount*-1 B.Amount应该排除它们…猜我的大脑工作不正常…发现了一个问题…如果VOT=J没有匹配的负数,它不会在应该的时候显示出来。当我自己运行它时,效果很好,但是当我运行它时在我的整个查询(查询1 union all查询2)中,我得到一个错误ORA-01789:查询块的结果列数不正确
我刚刚检查了所有列,并将其与您的预期输出进行了比较,所有列都存在(没有额外的列),并且顺序相同(应该是这样,因为我从预期输出的标题行进行了复制/粘贴,以获得需要输出的列。)AmtIdx
是否会标记为附加字段?您的预期