Ir para conteúdo

POWERED BY:

Arquivado

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

Creeed

[Resolvido] Query

Recommended Posts

[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

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

...

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

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

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

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

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

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

×

Informação importante

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