Reputation: 15061
I currently have a query which works perfectly, results are all correct, however a modification is needed to remove unused lines with a certain VOT and matching VONO.
Currently the query brings back a result set like this.
Sample 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
Now what i want to do is only when VOT = J
and the VONO is same and the amounts cancel each other out i want them to not be shown (in this case the two values -77.82 and 77.82 cancel as they are VOT = J and they both are one the same VONO).
This would give a desired output like this:
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
Currently the query is this and gives the first output.
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'
Update (XQbert)
Ok so here is a (BASIC)SQL Fiddle : http://sqlfiddle.com/#!4/79611a/1/0
What is happening is that it is removing all VOT = J's rather than just the ones that total to 0 per VONO.
Sample Data:
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
Output:
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
Expected Output:
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
Upvotes: 1
Views: 66
Reputation: 168361
Oracle 11g R2 Schema Setup:
I've added 3 rows to your data - two with +100 amount and one with -100 amount to show that this can handle unequal numbers of positive and negative rows. (and also changed the AMOUNT
column to NUMBER(10,2)
).
CREATE TABLE gen
("PART_NO" varchar2(5), "TRANSACTION" varchar2(5), "YEAR" int, "QUANTITY" varchar2(4), "INV_COST" varchar2(5), "PARTSDESCRIPTION" varchar2(7), "COMPANY" int, "VONO" int, "TEXT" varchar2(10), "YEAR_PERIOD_KEY" int, "ACCOUNT" int, "ACC" varchar2(11), "CODE_B" int, "CODE_B_DESC" varchar2(5), "CODE_C" int, "CODE_C_DESC" varchar2(10), "CODE_F" varchar2(6), "CODE_F_DESC" varchar2(7), "REFERENCE_NUMBER" varchar2(8), "VOT" varchar2(3), "VOTD" varchar2(30), "AMOUNT" NUMBER(10,2), "SUPPLIER_ID" varchar2(5), "NAME" varchar2(10), "LINE_NO" varchar2(4), "OBJECT_CLASS" varchar2(6), "FOCDESCRIPTION" varchar2(6), "ROW_NO" int)
;
INSERT ALL
INTO gen ("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")
VALUES ('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)
INTO gen ("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")
VALUES (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', 77.82, '52254', 'Automotive', NULL, '131100', 'Mobile', 2)
INTO gen ("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")
VALUES (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)
INTO gen ("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")
VALUES (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', -77.82, '52254', 'Automotive', NULL, '131100', 'Mobile', 4)
INTO gen ("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")
VALUES (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)
INTO gen ("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")
VALUES (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)
INTO gen ("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")
VALUES (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)
INTO gen ("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")
VALUES (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.00, '52254', 'Automotive', NULL, '131100', 'Mobile', 4)
INTO gen ("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")
VALUES (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.00, '52254', 'Automotive', NULL, '131100', 'Mobile', 4)
INTO gen ("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")
VALUES (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.00, '52254', 'Automotive', NULL, '131100', 'Mobile', 4)
SELECT * FROM dual
;
Query 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 |
Upvotes: 2
Reputation: 35343
Untested as sample data would be too complex...
This simply builds on what you've done. There likely is a simple more elegant way.
What this does is generate a common table expression (CTE) and join join one CTE to another, on VoNo and ensuring both tables have a Vot of J and then negates one of the amounts from a table compairing to the other table if they match, it eliminates them. This would present a problem however if you have more than two amounts with the same VoNo such as an additional amount of -75. It too would be excluded... perhaps not as desired. But if data can't occur this way... no issue.
Initial Response:
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'
With added union (Putting union then cte union results will not work. CTE has to be first and UNION has to be after the generated CTE but it could be before the 1st select or after the last.
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
Upvotes: 2