dimiguel 0 Denunciar post Postado Dezembro 3, 2013 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: 3Serial: 26, NF: 30, Total: 3Serial: 27, NF: 30, Total: 3Serial: 28: NF: 31, Total: 2Serial: 29, NF: 31, Total: 2E 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
Roberto Fagundes 40 Denunciar post Postado Dezembro 3, 2013 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 Compartilhar este post Link para o post Compartilhar em outros sites
dimiguel 0 Denunciar post Postado Dezembro 3, 2013 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
Roberto Fagundes 40 Denunciar post Postado Dezembro 3, 2013 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 Compartilhar este post Link para o post Compartilhar em outros sites
dimiguel 0 Denunciar post Postado Dezembro 3, 2013 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. Compartilhar este post Link para o post Compartilhar em outros sites
Roberto Fagundes 40 Denunciar post Postado Dezembro 3, 2013 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
dimiguel 0 Denunciar post Postado Dezembro 3, 2013 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
Roberto Fagundes 40 Denunciar post Postado Dezembro 3, 2013 e como retornou agora ? Compartilhar este post Link para o post Compartilhar em outros sites
dimiguel 0 Denunciar post Postado Dezembro 3, 2013 A mesma coisa, não mudou absolutamente nada. Compartilhar este post Link para o post Compartilhar em outros sites
Roberto Fagundes 40 Denunciar post Postado Dezembro 3, 2013 Então, tenta deixar apenas isto no seu group by: GROUP BY MovimentoProduto.nota_fiscal Compartilhar este post Link para o post Compartilhar em outros sites
dimiguel 0 Denunciar post Postado Dezembro 3, 2013 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
Roberto Fagundes 40 Denunciar post Postado Dezembro 3, 2013 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
dimiguel 0 Denunciar post Postado Dezembro 3, 2013 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
Roberto Fagundes 40 Denunciar post Postado Dezembro 3, 2013 A melhor forma cara é você criar uma outra tabela separada só para armazenar a nota_fiscal ai você faria o select em cima dessa tabela ao invés de ser direto nos produtos Compartilhar este post Link para o post Compartilhar em outros sites
dimiguel 0 Denunciar post Postado Dezembro 4, 2013 Continuo empacado nessa "busca por uma busca" mais eficiente. Alguém tem mais alguma sugestão? Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Dezembro 4, 2013 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
dimiguel 0 Denunciar post Postado Dezembro 5, 2013 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