Using SUM () in mysql returning incorrect value

1

I'm having trouble building an sql that returns the sum of the entries and the sum of the outputs correctly. I have tables tbl_produtos(id_produto,NomeProduto) , tbl_entradas_produtos(Id_produto,QuantProdutos,Estoque,ExcluirProdutoEnt) , tbl_saidas_produtos(Id_produto,QuantProdutos,Estoque,ExcluirProdutoSaida)

This is the sql I'm using:

$sql = "SELECT p.NomeProduto, \n"
     . "IFNULL(SUM(ep.QuantProdutos),0) as Entrada, \n"
     . "IFNULL(SUM(sp.QuantProdutos),0) as Saida,\n"
     . "(IFNULL(SUM(ep.QuantProdutos),0) - IFNULL(SUM(sp.QuantProdutos),0)) as Total\n"
     . "FROM tbl_entradas_produtos ep \n"
     . "inner join tbl_produtos p \n"
     . "on (p.idProduto=ep.IdProduto and ep.ExcluirProdutoEnt=0 and ep.Estoque=$IdEstoque) \n"
     . "left join tbl_saidas_produtos as sp \n"
     . "on (sp.IdProduto = p.idProduto and sp.Estoque = $IdEstoque and sp.ExcluirProdutoSaida = 0)\n"
     . "Group by p.NomeProduto";

The purpose of this sql is to return:

  • The 1st column with the product names;
  • The 2nd column with the sum of the "Product Quantity" of all entries of each product;
  • The 3rd column with the sum of the "Product Quantity" of all outputs of each product;
  • The 4th column with the Total (sum of the number of entries - sum of the number of outputs)

But it returns me some duplicate records, like the example I simulated in my database, it should return this:

NOME DO PRODUTO | ENTRADA   | SAIDA | EM ESTOQUE
ALFACE          | 105       | 40    | 65
BANANA          | 50        | 0     | 50 
CENOURA         | 80        | 15    | 65

But it returns me this:

NOME DO PRODUTO | ENTRADA   | SAIDA | EM ESTOQUE
ALFACE          | 105       | 80    | 25 
BANANA          | 50        | 0     | 50 
CENOURA         | 160       | 30    | 130

Yes, I simulated this query and I did not get any alternatives to reach the correct values, this is beyond my knowledge ... In the bank I have the following lines that result in the scenario example I mentioned above ...

tbl_entradas_produtos:
id | IdProduto | QuantProdutos | Estoque | ExcluirProdutoEnt 
1  | 1         | 75            | 2       | 0
2  | 2         | 75            | 2       | 0
3  | 2         | 30            | 2       | 0
4  | 1         |  5            | 2       | 0
5  | 3         | 50            | 2       | 0

tbl_produtos:
idProduto | NomeProduto
1         | CENOURA
2         | ALFACE
3         | BANANA

tbl_saidas_produtos
id  | IdProduto | QuantProdutos | Estoque | ExcluirProdutoSaida
1   | 1         | 10            | 2       | 0
2   | 2         | 40            | 2       | 0
3   | 1         |  5            | 2       | 0
    
asked by anonymous 02.08.2016 / 18:14

1 answer

0

This happens because the number of records in the tbl_entradas_produtos and tbl_saidas_produtos tables are different. A workable solution is to use subquery:

SELECT p.idproduto, p.nomeproduto,
    IFNULL((SELECT SUM(ep.quantprodutos) FROM tbl_entradas_produtos ep
            WHERE ep.idproduto = p.idproduto AND ep.excluirprodutoent = 0 AND ep.estoque = 2), 0) AS entrada,
    IFNULL((SELECT SUM(sp.quantprodutos) FROM tbl_saidas_produtos sp
            WHERE sp.idproduto = p.idproduto AND sp.excluirprodutosaida = 0 AND sp.estoque = 2), 0) AS saida
FROM tbl_produtos p;
    
03.08.2016 / 13:06