Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

dimiguel

soma na busca

Recommended Posts

Estou tendo problemas para realizar a seguinte consulta:

- Tenho N notas fiscais com Y produtos cada. Preciso listar todas as notas fiscais com seus produtos e a soma de produtos por nota fiscal. P.e.:

Serial: 25, NF: 30, Total: 3
Serial: 26, NF: 30, Total: 3
Serial: 27, NF: 30, Total: 3
Serial: 28: NF: 31, Total: 2
Serial: 29, NF: 31, Total: 2

E assim por diante. É claro que a query é mais complexa que isso:

SELECT
Fornecedor.name,
MovimentoProduto.nota_fiscal,
DATE_FORMAT(MovimentoProduto.data_notafiscal,'%d/%c/%Y') AS 'data',
SUM((CASE WHEN MovimentoProduto.nota_fiscal = MovimentoProduto.nota_fiscal THEN 1 ELSE 0 END)) AS Total,
MovimentoIIS.iis
FROM movimento_produtos AS MovimentoProduto
LEFT JOIN fornecedores AS Fornecedor
ON Fornecedor.id = MovimentoProduto.fornecedor_id
LEFT JOIN movimento_produtos_itens AS MovimentoProdutoItem
ON MovimentoProdutoItem.movimento_produto_id = MovimentoProduto.id
LEFT JOIN produtos AS Produto
ON Produto.id = MovimentoProdutoItem.produto_id
LEFT JOIN movimento_iis AS MovimentoIIS
ON MovimentoIIS.movimento_produtos_item_id = MovimentoProdutoItem.id
WHERE (MONTH(MovimentoProduto.data_movimento) = 11) AND (YEAR(MovimentoProduto.data_movimento) = 2013)
AND MovimentoProduto.tipo = "entrada"
AND MovimentoProduto.empresa_id = 10
AND MovimentoProduto.status = "ativo"
AND Produto.id = 19
GROUP BY MovimentoIIS.iis HAVING COUNT(MovimentoIIS.iis)
ORDER BY MovimentoProduto.data_notafiscal,MovimentoProduto.nota_fiscal,MovimentoProduto.data_movimento

No SUM() tentei fazer uma comparação "ridícula" na esperança de "se nota fiscal = nota fiscal, então soma, se não, não faz nada". Eu poderia realizar essa conta em outra query, mas por questões de performance achei melhor fazer tudo em uma somente (essa consulta retorna mais de 60 mil linhas).

 

Alguém tem alguma sugestão para melhorar essa consulta e trazer o resultado que preciso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu faria exatamente desta forma,

pois se você não colocar o CASE dentro do SUM()

ele vai te retornar todos os produtos de todas as notas

 

Então, Roberto, a consulta funciona, me traz todos os dados que preciso corretamente porém o SUM() não está funcionando como deveria ou seja, fazendo a soma de produtos quando é a mesma nota. Nisso que estou em dificuldade :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara então, eu precisaria da sua base para testar, e da forma que você quer retornar

se você puder fazer um dump das tabelas relacionadas neste select fica mais facíl te ajudar

 

Gostaria muito de fazer isso, mas não posso. Os dados que tenho nessas tabelas são confidenciais. O máximo que posso, e segue abaixo, é um print com alguns resultados. A coluna em destaque é a que deveria conter a soma. Exemplo: na nota fiscal 575 existem 150 produtos, na coluna "total", que está em destaque, deveria vir este número (150). Como pode ver, não está fazendo a soma.

 

colunas.jpg

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você reparar os produtos não estão sendo agrupados pela nota_fiscal

ou seja cada linha é um mesmo o que você pode fazer é no group by

adiconar MovimentoProduto.nota_fiscal ficando assim:

 

GROUP BY MovimentoProduto.nota_fiscal, MovimentoIIS.iis HAVING COUNT(MovimentoIIS.iis)

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Se você reparar os produtos não estão sendo agrupados pela nota_fiscal

ou seja cada linha é um mesmo o que você pode fazer é no group by

adiconar MovimentoProduto.nota_fiscal ficando assim:

 

GROUP BY MovimentoProduto.nota_fiscal, MovimentoIIS.iis HAVING COUNT(MovimentoIIS.iis)

 

Ainda assim não rolou :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Então, tenta deixar apenas isto no seu group by:

 

GROUP BY MovimentoProduto.nota_fiscal

 

Perfeito! Com exceção do fato de que agora os resultados estão agrupados ou seja, trás somente uma linha de cada nota fiscal, e não uma por produto como antes - e como precisa ser.

 

Cara, estou fritando meu cérebro com isso já tem uns 3 dias, tá osso!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então a única forma seria você fazer um SubSelect no lugar do SUM() que ficaria assim:

 

SELECT
Fornecedor.name,
MovimentoProduto.nota_fiscal,
DATE_FORMAT(MovimentoProduto.data_notafiscal, '%d/%c/%Y') AS data
(select count(nota_fiscal) from movimento_produtos where nota_fiscal = MovimentoProduto.nota_fiscal) AS Total, MovimentoIIS.iis
FROM movimentoprodutos AS MovimentoProduto

 

E deixar o group by como você havia feito antes de postar o tópico

 

Pelo menos no meu ponto de vista...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então a única forma seria você fazer um SubSelect no lugar do SUM() que ficaria assim:

 

SELECT
Fornecedor.name,
MovimentoProduto.nota_fiscal,
DATE_FORMAT(MovimentoProduto.data_notafiscal, '%d/%c/%Y') AS data
(select count(nota_fiscal) from movimento_produtos where nota_fiscal = MovimentoProduto.nota_fiscal) AS Total, MovimentoIIS.iis
FROM movimentoprodutos AS MovimentoProduto

 

E deixar o group by como você havia feito antes de postar o tópico

 

Pelo menos no meu ponto de vista...

 

Excelente a ideia, mas como te falei, tenho problema com performance. Estou rodando a consulta há 10 minutos e ainda não tive resultado (o problema de subselect é isso). Como te falei, são quase 60 mil registros, haja máquina para fazer este processo de forma rápida... Continuo nas minhas tentativas! Todas as suas sugestões tem sido válidas, obrigado"

Compartilhar este post


Link para o post
Compartilhar em outros sites

tentou ?

 

 

SELECT Fornecedor.name, MovimentoProduto.nota_fiscal, 
DATE_FORMAT(MovimentoProduto.data_notafiscal, '%d/%c/%Y') AS data ,
count(distinct  MovimentoProduto.nota_fiscal) AS Total, 
FROM movimentoprodutos AS MovimentoProduto

 

 




			
		

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

tentou ?

 

 

SELECT Fornecedor.name, MovimentoProduto.nota_fiscal, 
DATE_FORMAT(MovimentoProduto.data_notafiscal, '%d/%c/%Y') AS data ,
count(distinct  MovimentoProduto.nota_fiscal) AS Total, 
FROM movimentoprodutos AS MovimentoProduto

 

 


 

Acabei de tentar, mas ele me retorna somente uma linha, com a soma total.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.