Jump to content
Sign in to follow this  
slnunes

Script SQL que utiliza SUM não está retornando os valores corretos

Recommended Posts

Olá, fiz vários testes e não consegui identificar o porque essa consulta realiza a soma dos valores dos registros de forma incorreta:

$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 Posicao\n"
. "FROM `tbl_entradas_produtos` ep \n"
. "inner join tbl_produtos p \n"
. "on ep.IdProduto = p.idProduto and ep.ExcluirProdutoEnt = 0 \n"
. "left join tbl_saidas_produtos as sp \n"
. "on (sp.IdProduto = p.idProduto and sp.Estoque = $IdEstoque) and sp.ExcluirProdutoSaida = 0\n"
. "where ep.Estoque=$IdEstoque Group by p.NomeProduto";

Realizo essa consulta para montar um relatório de quantidade de produtos em estoque, criei um cenário onde ele deveria retornar o seguinte:

NOME DO PRODUTO | ENTRADA | SAIDA | EM ESTOQUE

BANANA 105 40 65

ALFACE 50 0 50

CENOURA 80 15 65

Porém ele retorna o seguinte:

NOME DO PRODUTO | ENTRADA | SAIDA | EM ESTOQUE

BANANA 105 80 25

ALFACE 50 0 50

CENOURA 160 30 130

Share this post


Link to post
Share on other sites

tente algo do tipo

select cod_produto,
          sum(entrada) entrada,
          sum(saida) saida
from
(select cod_produto, sum(valor) from entrada group by cod_produto) t_entrada,
(select cod_produto, sum(valor) from saida group by cod_produto) t_saida
where t_entrada.cod_produto = t_saida.cod_produto
group by cod_produto

como entrada e saida podem ter quantidades de registros diferentes é preciso (em teste) ahrupar antes

para somar corretamente

Share this post


Link to post
Share on other sites

Muito obrigado pela ajuda, tentei aplicar a dica porém continuo com um pouco de dificuldade para executar a consulta e obter o retorno correto...

Vou tentar exemplificar melhor o cenário...

No banco de dados consulto essas tabelas:

"tbl_entradas_produtos: (id_produto, quantidade_produto...)"

"tbl_saidas_produtos: (id_produto, quantidade_produto...)"

"tbl_produtos: (id_produto, nome_produto...)"

Preciso montar a consulta de uma forma que:

Agrupe a primeira coluna pelo atributo nome_produto,

a segunda coluna precisa somar toda a "quantidade_produto" de todas as linhas de tbl_entradas_produtos que correspondem a cada produto,

a terceira coluna precisa somar toda a "quantidade_produto" de todas as linhas de tbl_saidas_produtos que correspondem a cada produto

e a quarta coluna é montada com a diferença entre a soma das entradas de cada produto e a soma das saidas de cada produto...

Share this post


Link to post
Share on other sites

Tente usar a sql do #2 fazendo um join com a tabela de produtos.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Similar Content

    • By britoriquee
      Olá pessoal!

      Tenho dois bancos: dt_dblogin e dt_dbdados, o primeiro salva os dados de login do usuário, como login, senha, id, etc... Já o segundo salva dados da empresa do usuário, como nome, endereço, cnpj, dentre varios outros. 
       
      A minha dúvida é: Como faço para verificar qual usuário está logado para liberar o conteúdo certo da empresa dele que está no outro banco? 
       
      Agradeço a atenção.
    • By Mfenoglio
      Galera boa tarde, estou com o seguinte problema.
      Eu quero fazer uma conta entre duas tabelas se for PAGO ou RECEBIDO.
      Minha query

       
      SELECT F10_CODBANCO, F10_VALOR, F05_RECPAG, SUM(F05_VALOR) AS VALMOV, G27_NOMEBANCO FROM F10, F05, G27 WHERE F10_GRUPO = F05_GRUPO AND F10_EMPRESA = F05_EMPRESA AND F10_FILIAL = F05_FILIAL AND F10_CODBANCO = F05_BANCO AND F10_GRUPO = G27_GRUPO AND F10_EMPRESA = G27_EMPRESA AND F10_FILIAL = G27_FILIAL AND F10_CODBANCO = G27_CODIGO AND G27_EXCLUIDO = 'N' AND F10_EXCLUIDO = 'N' AND F05_EXCLUIDO = 'N' AND F10_VALOR <> 0 GROUP BY F10_CODBANCO, F10_VALOR, F05_RECPAG, G27_NOMEBANCO ORDER BY F10_CODBANCO  
      o que eu quero é o seguinte, Se F05_RECPAG for igual a P então faça F10_VALOR - SUM(F05_VALOR) AS VALMOV .... agora se for igual a R faça F10_VALOR + SUM(F05_VALOR) AS VALMOV.
       
      Agradeço quem puder me ajudar. vlw
    • By leonardoc.g
      Quando eu tento fazer conexão no banco de dados pelo Dreamweaver me aparece essa mensagem:
       
      your php server doesn't have the MySQL module loaded or you cant't use the mysql_(p)connect functions
       
       
    • By Julie_santiago
      Olá!
      Pessoal, preciso muito de um help urgente. Estou tentando fazer uma simples query ao banco de dados, usando o Axios. Mas, não importa a forma de fazer a requisição, o Axios não funciona. O HTML está abaixo, onde chamo a função enviaDados() através do onsubmit.
      <div class="input-group md-form"> <form method="get" onsubmit="enviaDados()" name="buscar"> <input type="text" id="Form-search2" class="form-control" name="nomeReagente"> <label for="Form-search2">Search</label> <input type="submit" name="pesquisar" value="buscar"> </form> <span class="input-group-text dark lighten-2" id="basic-text1"> <i class="fas fa-search text-dark" aria-hidden="true"></i> </span> </div> Meu arquivo main.js que contém a função enviaDados().
      function enviaDados(){ let nome = buscar.nomeReagente.value recebeDados(nome); } Dentro dessa função, estou chamando outra: recebeDados() que executa a requisição Axios. Passo como parâmetro o valor lá do meu input. OBS.: Meu código está assim, aparentemente confuso, porque o objetivo é ter funções que enviam os dados dos meus formulários e outras funções (genéricas) para receber e tratar esses dados. Abaixo a função recebeDados():
      function recebeDados(nome_reagente){ axios.get('http://localhost/Quimica/php/recebe_json.php', { params: { nome } }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log('Não foi possível realizar a requsição: '+error); }) .finally(function () { }); } Não importa o que eu faça, sempre cai no CATCH  - request aborted. Preciso muito resolver esse problema, mas não faço ideia do que pode ser. Relevem qualquer "noobice" porque estou aprendendo o básico ainda.
       
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.