Vitaly
Vitaly

Reputation: 55

inner join incorrect sum()

table 1 - jos_addRabotyAndProstoyMain

| id      | Marka    | OtrabotanoMachine_hours|
| 8       | 90979    | 6                      |
| 9       | 90979    | 11                     |
| 10      | 90979    | 11                     |
| 11      | 90979    | 11                     |
| 12      | 90979    | 11                     |

table 2 - jos_addRabotyAndProstoySecond

| id      | Hours    | id_fk|
| 13      | 2        | 8    |
| 14      | 2        | 9    |
| 15      | 3        | 9    |
| 16      | 3        | 9    |
| 17      | 4        | 10   |
| 18      | 2        | 10   |
| 19      | 2        | 11   |
| 20      | 3        | 12   |

My inner join query:

 SELECT avto.Marka AS Marka,sum(main.OtrabotanoMachine_hours) as 'work hours', SUM(sec.Hours) as downtime
FROM
jos_addRabotyAndProstoyMain main
INNER JOIN avto ON main.Marka=avto.ID_Avto
INNER JOIN jos_addRabotyAndProstoySecond sec ON sec.id_fk = main.id 
GROUP BY avto.Marka

I get the following result:

  | Marka    | work hours    | downtime|
  | Liebherr | 83            | 21      |

As you can see, sum in column 'work hours' incorrect(83 instead 50), because for primary key in the main table complies 1-3 foreign keys in the secondary table. I think, what in row INNER JOIN jos_addRabotyAndProstoySecond sec ON sec.id_fk = main.id need some filter.I am no idea how to solve it, please help. I want result such as:

  | Marka    | work hours    | downtime|
  | Liebherr | 50            | 21      |

Upvotes: 3

Views: 139

Answers (1)

Giorgos Betsos
Giorgos Betsos

Reputation: 72175

You can fix your query by aggregating jos_addRabotyAndProstoySecond table by id_fk field. The JOIN operation between jos_addRabotyAndProstoySecond and jos_addRabotyAndProstoyMain is transformed into an 1-1 join and duplicates are eliminated:

SELECT avto.Marka AS Marka,
        sum(main.OtrabotanoMachine_hours) as 'work hours', 
         SUM(sec.Hours) as downtime
FROM jos_addRabotyAndProstoyMain main
INNER JOIN avto ON main.Marka=avto.ID_Avto
INNER JOIN (
   SELECT id_fk, SUM(Hours) AS Hours
   FROM jos_addRabotyAndProstoySecond 
   GROUP BY id_fk) sec ON sec.id_fk = main.id 
GROUP BY avto.Marka

Upvotes: 2

Related Questions