Using SUM() in mysql returning incorrect value

Asked

Viewed 579 times

2

I have difficulties to mount an sql that returns the sum of the entries and the sum of the output correctly. I have the 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 goal of this sql is to return:

  • The first column with the product names;
  • The 2nd column with the sum of the "Quantity and products" of all inputs of each product;
  • The 3rd column with the sum of the "Quantity and products" of all outputs of each product;
  • The 4th column and the Total (sum of the quantity of inputs - sum of the quantity of outputs)

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

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

But this comes back to me:

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

yes, I simulated with this query and could not find any alternative to achieve the correct values, this is exceeding my knowledge... In the bank I have the following lines that result in the example of the scenario 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

1 answer

0

This happens because the number of records in the tables tbl_entradas_produtos and tbl_saidas_produtos are different. A viable 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;

Browser other questions tagged

You are not signed in. Login or sign up in order to post.