Sql 当满足条件时,仅消除总和为0的值

Sql 当满足条件时,仅消除总和为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_

我目前有一个查询,它工作得很好,结果都是正确的,但是需要修改以删除带有特定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_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
是否会标记为附加字段?您的预期