Eu preciso fazer uma query que representasse uma espécie de auditoria, ou seja, retornasse o total de produtos que cada vendedor vendeu. A minha pergunta é: Quantos protudos "Produto A" o vendedor "Miris" vendeu? Tá, e a query pra isso? Vale lembrar que eu não tenho um registro que represente esta informação na tabela de Vendas.
1ª desilusão (solução que não funciona): usar LEFT JOIN
Normalmente as pessoas pensam que o left funciona, mas não! Uma vez que eu já tenho informações (mesmo que algumas) de todos os vendedores e de todos os produtos, o Left nunca me geraria valores nulos para aqueles que estejam faltando. Mesmo que eu não tivesse, por exemplo, nenhuma venda para o vendedor "Miris" registrada em vendas, o Left me geraria apenas um valor nulo para o vendedor, e não uma pra cada produto que ele não vendeu!
2ª desilusão: LEFT JOIN de Vendedor com Vendas junta com um RIGHT JOIN com produtos, um GROUP BY de QTDE_VENDIDA, e de quebra um HAVING COUNT(*) = 0, UNION ALL "três pulinhos" e um "são loginho, são loginho, onde está o meu registro?"
Prática mais comum do que parece. Muita gente desesperada pelo prazo pra entregar seus projetos fazem isso.
Solução da coisa: CROSS JOIN. Este realiza um produto carteziano (para os leigos, este é um tipo produto que não é salvo na nossa tabela de produtos) entre duas tabelas. Assim o commando …FROM VENDEDORES CROSS JOIN PRODUTOS geraria todas as combinações possíveis entre os vendedores e o produto. Para a solução do nosso problema, é só relacionar com a tabela de vendas após isso. A query seria semelhante à essa:
SELECT VENDR.VENDEDOR,
PROD.PRODUTO,
ISNULL(QTDE_VENDIDA, 0)
FROM MIRIS_VENDEDORES VENDR
CROSS JOIN MIRIS_PRODUTOS PROD
LEFT JOIN MIRIS_VENDAS VENDAS
ON VENDR.VENDEDOR = VENDAS.VENDEDOR
AND PROD.PRODUTO = VENDAS.PRODUTO
O resultado da query seria semelhante à este:
Nenhum comentário:
Postar um comentário