MySQL - Tratar consultas vazias entre várias tabelas

28/07/2021

0

Tenho as seguintes tabelas:

TAB.USUARIO [armazena todos clientes]
- id_usuario
- nome


TAB.EMPRESA [armazena todas empresas]
- id_empresa
- nome


TAB.ASSOCIADO [armazena apenas usuários e empresas que se associaram]
- id_associado
- fk_usuario
- fk_empresa


TAB.VENDA [armazena apenas quando algum usuário associado a determinada empresa realiza uma venda]
- id_venda
- data
- valor
- fk_usuario
- fk_empresa


TAB.LOG [toda vez que ocorre uma venda, é atualizado essa tabela]
- id_log
- quantidade
- data_ini
- data_fim
- fk_usuario
- fk_empresa


Suponha que eu tenho o seguinte banco:

TAB.USUARIO
1 --- João
2 --- Maria
3 --- José


TAB.EMPREA
1 --- aaa
2 --- bbb
3 --- ccc


TAB.ASSOCIADO [observe que dos 3 usuários, apenas 2 estão associados]
1 --- 1 --- 1
2 --- 2 --- 2


TAB.VENDA [observe que apenas 1 usuário associado vendeu duas vezes]
1 --- 27/07/2021 --- 50.00 --- 1 --- 1
2 --- 28/07/2021 --- 10.00 --- 1 --- 1


TAB.LOG 
1 --- 2 --- 27/07/2021 --- 28/07/2021 --- 1 --- 1


No meu relatório eu preciso buscar todos usuários que estão associados a empresa X, trazendo data e sum(valor) da tabela VENDA, caso tenha usuários associados e que não venderam nada, traga zero para cada uma dessas colunas. O mesmo ocorre em LOG, traga quantidade, data_ini e data_fim, caso NÃO TENHA registro, traga zero em suas colunas.

Agradeço desde já ;)
Isabela

Isabela

Responder

Post mais votado

28/07/2021

algo assim:
SELECT
   TE.NOME EMPRESA,
   TU.NOME USUARIO,
   TV.DATA,
   COALESCE(SUM(TV.VALOR),0) VALORVENDA
FROM
   TABUSUARIO TU
INNER JOIN -- traz informações se houver dados dos dois lados (usuario e associado)
   TABASSOCIADO TA ON TA.FK_USUARIO = TU.ID_USUARIO
INNER JOIN -- traz informações se houver dados dos dois lados (usuario, associado e empresa)
   TABEMPRESA TE ON TE.ID = TU.ID_EMPRESA = TA.FK_EMPRESA
LEFT JOIN -- traz informações se houver dados ao menos do lado esquerdo (usuario, associado e empresa) mesmo que não tenha no direito (venda)
   TAB.VENDA TV ON TV.FK_USUARIO = TU.ID_USUARIO AND TV.FK_EMPRESA = TE.ID_EMPRESA
WHERE
   TE.ID_EMPRESA = EMPRESA_DESEJADA
GROUP BY
   TE.NOME EMPRESA,
   TU.NOME USUARIO,
   TV.DATA

Emerson Nascimento

Emerson Nascimento
Responder

Mais Posts

19/08/2021

Isabela

Muito obrigada Emerson Nascimento
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar