'Problem with subtracting columns from same table with subquery

I have one table on which i'm trying to subtruct two columns. In that regard I'm using two subqueries, each subquery select data by different criteria.

Here is example of my table with data and query which i'm executing and trying to get this result:

+---------------+-------------+-------------+
| SifraProizvoda| rezultat    | BrojRacuna  |
+---------------+-------------+-------------+
| 509001600     | 16000       | 9/PP1       |
| 509001800     | 21989       | 10/PP1      |
| 509001700     | 9000        | 10/PP1      |
+---------------+-------------+-------------+

But somehow i get this:

+---------------+-------------+-------------+
| SifraProizvoda| rezultat    | BrojRacuna  |
+---------------+-------------+-------------+
| 509001300     | 1000        | 9/PP1       |
| 509001300     | 4000        | 9/PP1       |
| 509001600     | 16000       | 9/PP1       |
| 509001800     | 21989       | 10/PP1      |
| 509001700     | 9000        | 10/PP1      |
+---------------+-------------+-------------+

Which is not correct. For product 509001300 i should have 0 as result.

How to properly join two subqueries on the same table?

Table definion and insert data:

CREATE TABLE `odobrenja` (
    `BrojOdobrenja` VARCHAR(50),
    `SifraProizvoda` VARCHAR(50),
    `OdobrenoKOM` INT(11),
    `IzvezenoKOM` INT(11),
    `UvezenoGPKOM` INT(11),
    `PS` TINYINT(4) NULL DEFAULT '0',
    `BrojRacuna` VARCHAR(50) NULL,
    `GodinaRN` SMALLINT(6),
    `BrojDeklaracije` VARCHAR(50),
    `DatumIsteka` DATE,
    `ID` BIGINT(20) NOT NULL AUTO_INCREMENT,
    `DVRn` DATETIME NULL DEFAULT NULL,
    `IDVezaRNIzvoz` INT(11) NOT NULL DEFAULT '0',
    `IDRacun` INT(11) NOT NULL DEFAULT '0',
    PRIMARY KEY (`ID`) USING BTREE
);

INSERT INTO `odobrenja` (`BrojOdobrenja`, `SifraProizvoda`, `OdobrenoKOM`, `IzvezenoKOM`, `UvezenoGPKOM`, `PS`, `BrojRacuna`, `GodinaRN`, `BrojDeklaracije`, `DatumIsteka`, `ID`, `DVRn`, `IDVezaRNIzvoz`, `IDRacun`) VALUES ('20032022-1951', '509001300', 0, 5000, 0, 2, '9/PP1/7', 2022, '12121212', NULL, 2429, '2022-03-20 00:00:00', 0, 93);
INSERT INTO `odobrenja` (`BrojOdobrenja`, `SifraProizvoda`, `OdobrenoKOM`, `IzvezenoKOM`, `UvezenoGPKOM`, `PS`, `BrojRacuna`, `GodinaRN`, `BrojDeklaracije`, `DatumIsteka`, `ID`, `DVRn`, `IDVezaRNIzvoz`, `IDRacun`) VALUES ('20032022-1951', '509001600', 0, 20000, 0, 2, '9/PP1/7', 2022, '12121212', NULL, 2430, '2022-03-20 00:00:00', 0, 93);
INSERT INTO `odobrenja` (`BrojOdobrenja`, `SifraProizvoda`, `OdobrenoKOM`, `IzvezenoKOM`, `UvezenoGPKOM`, `PS`, `BrojRacuna`, `GodinaRN`, `BrojDeklaracije`, `DatumIsteka`, `ID`, `DVRn`, `IDVezaRNIzvoz`, `IDRacun`) VALUES ('20032022-1951', '509001800', 0, 22000, 0, 2, '10/PP1/7', 2022, '4343434', NULL, 2431, '2022-03-20 00:00:00', 0, 94);
INSERT INTO `odobrenja` (`BrojOdobrenja`, `SifraProizvoda`, `OdobrenoKOM`, `IzvezenoKOM`, `UvezenoGPKOM`, `PS`, `BrojRacuna`, `GodinaRN`, `BrojDeklaracije`, `DatumIsteka`, `ID`, `DVRn`, `IDVezaRNIzvoz`, `IDRacun`) VALUES ('20032022-1951', '509001700', 0, 14000, 0, 2, '10/PP1/7', 2022, '4343434', NULL, 2432, '2022-03-20 00:00:00', 0, 94);
INSERT INTO `odobrenja` (`BrojOdobrenja`, `SifraProizvoda`, `OdobrenoKOM`, `IzvezenoKOM`, `UvezenoGPKOM`, `PS`, `BrojRacuna`, `GodinaRN`, `BrojDeklaracije`, `DatumIsteka`, `ID`, `DVRn`, `IDVezaRNIzvoz`, `IDRacun`) VALUES ('20032022-1951', '509001300', 0, 0, 4000, 3, '9/2022', 2022, '', NULL, 2439, '2022-03-20 00:00:00', 93, 0);
INSERT INTO `odobrenja` (`BrojOdobrenja`, `SifraProizvoda`, `OdobrenoKOM`, `IzvezenoKOM`, `UvezenoGPKOM`, `PS`, `BrojRacuna`, `GodinaRN`, `BrojDeklaracije`, `DatumIsteka`, `ID`, `DVRn`, `IDVezaRNIzvoz`, `IDRacun`) VALUES ('20032022-1951', '509001600', 0, 0, 4000, 3, '9/2022', 2022, '', NULL, 2440, '2022-03-20 00:00:00', 93, 0);
INSERT INTO `odobrenja` (`BrojOdobrenja`, `SifraProizvoda`, `OdobrenoKOM`, `IzvezenoKOM`, `UvezenoGPKOM`, `PS`, `BrojRacuna`, `GodinaRN`, `BrojDeklaracije`, `DatumIsteka`, `ID`, `DVRn`, `IDVezaRNIzvoz`, `IDRacun`) VALUES ('20032022-1951', '509001800', 0, 0, 11, 3, '9/2022', 2022, '', NULL, 2441, '2022-03-20 00:00:00', 94, 0);
INSERT INTO `odobrenja` (`BrojOdobrenja`, `SifraProizvoda`, `OdobrenoKOM`, `IzvezenoKOM`, `UvezenoGPKOM`, `PS`, `BrojRacuna`, `GodinaRN`, `BrojDeklaracije`, `DatumIsteka`, `ID`, `DVRn`, `IDVezaRNIzvoz`, `IDRacun`) VALUES ('20032022-1951', '509001300', 0, 1000, 0, 2, '11/PP1/7', 2022, '2323', NULL, 2444, '2022-03-20 00:00:00', 0, 95);
INSERT INTO `odobrenja` (`BrojOdobrenja`, `SifraProizvoda`, `OdobrenoKOM`, `IzvezenoKOM`, `UvezenoGPKOM`, `PS`, `BrojRacuna`, `GodinaRN`, `BrojDeklaracije`, `DatumIsteka`, `ID`, `DVRn`, `IDVezaRNIzvoz`, `IDRacun`) VALUES ('20032022-1951', '509001300', 0, 1000, 0, 2, '12/PP1/7', 2022, 'fdfd', NULL, 2447, '2022-03-25 00:00:00', 0, 96);
INSERT INTO `odobrenja` (`BrojOdobrenja`, `SifraProizvoda`, `OdobrenoKOM`, `IzvezenoKOM`, `UvezenoGPKOM`, `PS`, `BrojRacuna`, `GodinaRN`, `BrojDeklaracije`, `DatumIsteka`, `ID`, `DVRn`, `IDVezaRNIzvoz`, `IDRacun`) VALUES ('20032022-1951', '509001700', 0, 5000, 0, 2, '12/PP1/7', 2022, 'fdfd', NULL, 2449, '2022-03-25 00:00:00', 0, 96);
INSERT INTO `odobrenja` (`BrojOdobrenja`, `SifraProizvoda`, `OdobrenoKOM`, `IzvezenoKOM`, `UvezenoGPKOM`, `PS`, `BrojRacuna`, `GodinaRN`, `BrojDeklaracije`, `DatumIsteka`, `ID`, `DVRn`, `IDVezaRNIzvoz`, `IDRacun`) VALUES ('20032022-1951', '509001300', 0, 0, 1000, 3, '10/2022', 2022, '', NULL, 2452, '2022-03-26 00:00:00', 93, 0);
INSERT INTO `odobrenja` (`BrojOdobrenja`, `SifraProizvoda`, `OdobrenoKOM`, `IzvezenoKOM`, `UvezenoGPKOM`, `PS`, `BrojRacuna`, `GodinaRN`, `BrojDeklaracije`, `DatumIsteka`, `ID`, `DVRn`, `IDVezaRNIzvoz`, `IDRacun`) VALUES ('20032022-1951', '509001700', 0, 0, 5000, 3, '11/2022', 2022, '', NULL, 2453, '2022-03-26 00:00:00', 94, 0);
INSERT INTO `odobrenja` (`BrojOdobrenja`, `SifraProizvoda`, `OdobrenoKOM`, `IzvezenoKOM`, `UvezenoGPKOM`, `PS`, `BrojRacuna`, `GodinaRN`, `BrojDeklaracije`, `DatumIsteka`, `ID`, `DVRn`, `IDVezaRNIzvoz`, `IDRacun`) VALUES ('20032022-1951', '509001300', 0, 0, 1000, 3, '11/2022', 2022, '', NULL, 2454, '2022-03-26 00:00:00', 95, 0);
INSERT INTO `odobrenja` (`BrojOdobrenja`, `SifraProizvoda`, `OdobrenoKOM`, `IzvezenoKOM`, `UvezenoGPKOM`, `PS`, `BrojRacuna`, `GodinaRN`, `BrojDeklaracije`, `DatumIsteka`, `ID`, `DVRn`, `IDVezaRNIzvoz`, `IDRacun`) VALUES ('20032022-1951', '509001300', 0, 0, 1000, 3, '11/2022', 2022, '', NULL, 2455, '2022-03-26 00:00:00', 96, 0);
INSERT INTO `odobrenja` (`BrojOdobrenja`, `SifraProizvoda`, `OdobrenoKOM`, `IzvezenoKOM`, `UvezenoGPKOM`, `PS`, `BrojRacuna`, `GodinaRN`, `BrojDeklaracije`, `DatumIsteka`, `ID`, `DVRn`, `IDVezaRNIzvoz`, `IDRacun`) VALUES ('20032022-1951', '509001700', 0, 0, 5000, 3, '11/2022', 2022, '', NULL, 2456, '2022-03-26 00:00:00', 96, 0);

query:

SELECT t1.SifraProizvoda, 
(COALESCE(t1.IzvezenoKOM, 0) - COALESCE(t2.UvezenoGPKOM, 0)) AS rezultat, t1.BrojRacuna
FROM  
(
   SELECT odobrenja.BrojOdobrenja, 
   odobrenja.SifraProizvoda, 
   odobrenja.IzvezenoKOM, 
   odobrenja.BrojRacuna, 
   odobrenja.IDracun 
   FROM odobrenja WHERE odobrenja.BrojOdobrenja = '20032022-1951' AND odobrenja.PS = 2) AS t1
LEFT JOIN
(
   SELECT 
   odobrenja.BrojOdobrenja, 
   odobrenja.SifraProizvoda, 
   odobrenja.UvezenoGPKOM AS UvezenoGPKOM, 
   odobrenja.BrojRacuna, odobrenja.IDVezaRNIzvoz 
   FROM odobrenja WHERE odobrenja.BrojOdobrenja = '20032022-1951' AND odobrenja.PS = 3) AS t2
ON t1.SifraProizvoda = t2.SifraProizvoda  and t1.IDracun = t2.IDVezaRNIzvoz  
HAVING rezultat > 0


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source