Creeed 0 Denunciar post Postado Abril 23, 2009 [Resolvido por Chrnos] Estou fazendo uma query pra montar um relatório, porém estou encontrando algumas dificuldades. SELECT DISTINCT b.DESCRICAO, COUNT( a.CODIGO ) AS PUBLICO, AVG( a.VALOR_NOMINAL ) AS TICKET_MEDIO, SUM( a.VALOR_NOMINAL ) AS RENDA FROM VENDAS a, SALAS b, HORARIOS c WHERE c.CODIGO = a.COD_HORARIO AND c.COD_LINHA = b.COD_LINHA AND c.COD_SALA = b.NUMERO AND ( c.DATA_HORA >= '2009-04-01 00:00:00' AND c.DATA_HORA <= '2009-04-30 23:59:59' ) GROUP BY b.CODIGO ORDER BY PUBLICO DESC Aí estou puxando o a quantidade de publico em cada horario, o valor do ticket medio e a renda de cada horario. A query funciona bem, puxa os valores certos, porém só puxa os produtos que tiverem algum registro em vendas, e eu gostaria de adicionar também os produtos que não venderam nada, com os valores de COUNT, AVG e SUM zerados. Como eu faria essa mudança na query? Desde já agradeço, Creeed. Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Abril 23, 2009 Em vez de usar o from VENDAS a, SALAS b, HORARIOS c use left joins das tabelas que não tem os dados principais. Algo como o select abaixo. SELECT DISTINCT b.DESCRICAO, COUNT( a.CODIGO ) AS PUBLICO, AVG( a.VALOR_NOMINAL ) AS TICKET_MEDIO, SUM( a.VALOR_NOMINAL ) AS RENDA FROM SALAS b LEFT JOIN HORARIOS c ON (AND c.COD_LINHA = b.COD_LINHA AND c.COD_SALA = b.NUMERO) LEFT JOIN VENDAS a ON (c.CODIGO = a.COD_HORARIO) WHERE ( c.DATA_HORA >= '2009-04-01 00:00:00' AND c.DATA_HORA <= '2009-04-30 23:59:59' ) GROUP BY b.CODIGO ORDER BY PUBLICO DESC Como não sei exatamente o que está gravado em cada uma das suas tabelas e como são os relacionamentos entre elas, talvez a query acima precise de ajustes... []'S Compartilhar este post Link para o post Compartilhar em outros sites
Creeed 0 Denunciar post Postado Abril 23, 2009 ... Só inverti a ordem das tabelas e funcionou perfeitamente. Nunca tinha trabalhado com left join, foi interessante aprender... Muito obrigado pela ajuda []'s Creeed Compartilhar este post Link para o post Compartilhar em outros sites
DragonBR 0 Denunciar post Postado Abril 23, 2009 Em vez de usar o from VENDAS a, SALAS b, HORARIOS c use left joins das tabelas que não tem os dados principais. Algo como o select abaixo. SELECT DISTINCT b.DESCRICAO, COUNT( a.CODIGO ) AS PUBLICO, AVG( a.VALOR_NOMINAL ) AS TICKET_MEDIO, SUM( a.VALOR_NOMINAL ) AS RENDA FROM SALAS b LEFT JOIN HORARIOS c ON (AND c.COD_LINHA = b.COD_LINHA AND c.COD_SALA = b.NUMERO) LEFT JOIN VENDAS a ON (c.CODIGO = a.COD_HORARIO) WHERE ( c.DATA_HORA >= '2009-04-01 00:00:00' AND c.DATA_HORA <= '2009-04-30 23:59:59' ) GROUP BY b.CODIGO ORDER BY PUBLICO DESC Como não sei exatamente o que está gravado em cada uma das suas tabelas e como são os relacionamentos entre elas, talvez a query acima precise de ajustes... []'S Somente para completar o post, um pouco de boa prática no mysql ^.^Algumas dicas: - Não utilize (XXX >= AND xxx<=), utilize between - Não utilize a alias sem sentido (a,b,c...) utilize nomes que fazem te lembra da tabela é bom manter um padrão ao nomear uma tabela - Porque utlizar o DISTINCT ?? Se você quer algo mais preciso não pode utilizar, ele pode omitir alguma informação importante Pode até ser um pouco chato no começo, mas é bom quando você pegar um sistema grande. No seu caso ficaria assim: SELECT SL.DESCRICAO, COUNT( VD.CODIGO ) AS PUBLICO, AVG( VD.VALOR_NOMINAL ) AS TICKET_MEDIO, SUM( VD.VALOR_NOMINAL ) AS RENDA FROM SALAS AS SL LEFT JOIN HORARIOS HR ON (AND HR.COD_LINHA = SL.COD_LINHA AND HR.COD_SALA = SL.NUMERO) LEFT JOIN VENDAS VD ON (HR.CODIGO = VD.COD_HORARIO) WHERE HR.DATA_HORA BETWEEN '2009-04-01 00:00:00' AND '2009-04-30 23:59:59' GROUP BY SL.CODIGO ORDER BY PUBLICO DESC Compartilhar este post Link para o post Compartilhar em outros sites
Creeed 0 Denunciar post Postado Abril 23, 2009 Desde que comecei a programar, no primeiro sistema que eu vi (um ERP de Importação/Exportação), todas as tabelas nas queries tinham nomes a, b, c ... Realmente nunca pensei em atribuir nomes mais convenientes, como faço com delphi e php. A partir de hoje assim o farei. Muito obrigado pelas dicas, com certeza serão bem aproveitadas. []'s Creeed ... Compartilhar este post Link para o post Compartilhar em outros sites
DragonBR 0 Denunciar post Postado Abril 23, 2009 Fico parecendo que eu estava criticando ele?? A minha ideia foi completar o post dele, só isso... :o E te ensinando um pouco de boas práticas, que é bom para o seu proprio conhecimento e desenvolvimento. Eu não duvido do conhecimento dele nem o seu :mellow: Editei o post para ficar mais claro a minha ideia Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Abril 23, 2009 Fico parecendo que eu estava criticando ele?? A minha ideia foi completar o post dele, só isso... :o E te ensinando um pouco de boas práticas, que é bom para o seu proprio conhecimento e desenvolvimento. Eu não duvido do conhecimento dele... :mellow: Hehehehe, não precisam acirrar os ânimos discutindo se o DragonBR tentou me ensinar ou não rsss... até porque o post que você fez DragonBR pode ser útil a muitos que se interessarem em lerem o mesmo, então encerremos o assunto por aqui ok? E sei que você não quis me criticar (e mesmo que fosse uma crítica, as vezes elas são úteis não são?). http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif E continuem assim, trabalhando e auxiliando a quem precisa. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif []'s Compartilhar este post Link para o post Compartilhar em outros sites
Creeed 0 Denunciar post Postado Abril 23, 2009 Disso eu realmente preciso http://forum.imasters.com.br/public/style_emoticons/default/assobiando.gif Ainda assim obrigado pela adição, como dito antes conhecimento é sempre bem vindo. E desculpe pelo mal entendido. Fico parecendo que eu estava criticando ele?? A minha ideia foi completar o post dele, só isso... :o E te ensinando um pouco de boas práticas, que é bom para o seu proprio conhecimento e desenvolvimento. Eu não duvido do conhecimento dele... :mellow: Compartilhar este post Link para o post Compartilhar em outros sites