1
resposta

[Dúvida] DÚVIDA Resolução: Produto mais vendido por cada vendedor em 2018

Estou com uma dúvida quanto a resolução de um exemplo que criei, cheguei perto imagino eu mas não consigo puxar uma parte do resultado pretendido. Estou tentando descobrir o Produto (Quantidade e nome) mais vendido por cada vendedor em 2018 por exemplo. a consulta que criei foi a consulta abaixo. Nela consigo fazer os vendedores e trazer o maior valor por produto, mas não consigo trazer o nome correto do produto dessa quantidade. Fica sempre trazendo o maior produto vendido e o que quero é o "nome do Maior vendido pela categoria "Vendedor", alguém consegue ajudar? obs: OS COMENTÁRIOS NO CÓDIGO ERA APENAS PARA EU VER DE UM VENDEDOR SE A SOMA ESTAVA CORRETA.

SELECT SUB.ano                          AS ANO,
       SUB.vendedor                     AS VENDEDOR,
       Min(SUB.produto)                 AS PRODUTO,
       Max(SUB.[qtd produtos vendidos]) AS [QTD]
FROM   (SELECT Year(NF.data)        AS ANO,
               TV.nome              AS VENDEDOR,
               TP.[nome do produto] AS PRODUTO,
               Sum(INF.quantidade)  AS [QTD PRODUTOS VENDIDOS]
        FROM   [itens notas fiscais] INF
               INNER JOIN [notas fiscais] NF
                       ON INF.numero = NF.numero
               INNER JOIN [tabela de vendedores] TV
                       ON NF.matricula = TV.matricula
               INNER JOIN [tabela de produtos] TP
                       ON INF.[codigo do produto] = TP.[codigo do produto]
        WHERE  NF.data BETWEEN '2018-01-01' AND'2018-12-31'
        /*AND TV.NOME ='Márcio Almeida Silva'*/
        GROUP  BY Year(NF.data),
                  TV.nome,
                  TP.[nome do produto]
       /*ORDER BY YEAR(NF.DATA) ASC,TV.NOME, [QTD PRODUTOS VENDIDOS] DESC*/) AS
       SUB
GROUP  BY SUB.ano,
          SUB.vendedor 
GROUP BY SUB.ANO,SUB.VENDEDOR
1 resposta

Oi, Bruno, tudo bem?

Desde já, peço desculpas pela demora em te responder.

Para obter o produto mais vendido conforme o vendedor, podemos utilizar a função ROW_NUMBER(), que atribui um número sequencial a cada linha dentro de um grupo definido pela cláusula PARTITION BY. Para um melhor entendimento, observe o código abaixo:

ROW_NUMBER() OVER (PARTITION BY TV.nome ORDER BY SUM(INF.quantidade) DESC) AS numero_linha

Para cada vendedor (TV.nome), a função ROW_NUMBER() irá atribuir um número sequencial com base na soma da quantidade de produtos vendidos (SUM(INF.quantidade)) em ordem decrescente (DESC). Ou seja, os registros são numerados de acordo com a quantidade de produtos vendidos por cada vendedor, do maior para o menor.

Bruno, este código será adicionado logo após [QTD PRODUTOS VENDIDOS]:

Sum(INF.quantidade)  AS [QTD PRODUTOS VENDIDOS],
ROW_NUMBER() OVER (PARTITION BY TV.nome ORDER BY SUM(INF.quantidade) DESC) AS numero_linha

A fim de que a consulta aconteça como o esperado, também teremos que modificar os comandos após o término da subconsulta. Neste final, adicionaremos o seguinte bloco de código:

WHERE numero_linha = 1

Com ele, iremos retornar apenas a primeira linha obtida por cada ROW_NUMBER, a qual representa justamente o produto mais vendido.

Ao fim, chegaremos no seguinte SELECT:

SELECT SUB.ano                          AS ANO,
       SUB.vendedor                     AS VENDEDOR,
       Min(SUB.produto)                 AS PRODUTO,
       Max(SUB.[qtd produtos vendidos]) AS [QTD]
FROM   (SELECT Year(NF.data)        AS ANO,
               TV.nome              AS VENDEDOR,
               TP.[nome do produto] AS PRODUTO,
               Sum(INF.quantidade)  AS [QTD PRODUTOS VENDIDOS],
               ROW_NUMBER() OVER (PARTITION BY TV.nome ORDER BY SUM(INF.quantidade) DESC) AS numero_linha
        FROM   [itens notas fiscais] INF
               INNER JOIN [notas fiscais] NF
                       ON INF.numero = NF.numero
               INNER JOIN [tabela de vendedores] TV
                       ON NF.matricula = TV.matricula
               INNER JOIN [tabela de produtos] TP
                       ON INF.[codigo do produto] = TP.[codigo do produto]
        WHERE  NF.data BETWEEN '2018-01-01' AND'2018-12-31'
        /*AND TV.NOME ='Márcio Almeida Silva'*/
        GROUP  BY Year(NF.data),
                  TV.nome,
                  TP.[nome do produto]
       /*ORDER BY YEAR(NF.DATA) ASC,TV.NOME, [QTD PRODUTOS VENDIDOS] DESC*/) AS
       SUB
GROUP  BY SUB.ano,
          SUB.vendedor 

A título de curiosidade, segue abaixo a tabela retornada pela consulta:

ANOVENDEDORPRODUTOQTD
2018Claudia MoraisClean - 350 ml - Laranja10793
2018Marcio Almeida SilvaLinha Refrescante - 700 ml - Morango/Limao11395
2018Roberta MartinsPedacos de Frutas - 1,5 Litros - Maca10377

Dessa forma, será possível visualizar todos os vendedores e os seus respectivos produtos mais vendidos!

Espero ter ajudado, Bruno. Em caso de dúvidas, fico à disposição.

Abraço.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software