segunda-feira, 25 de novembro de 2013

Obtendo o valor máximo de uma soma com PostgreSQL

Olá galera,

Hoje falarei sobre a consulta que precisei fazer em um projeto. A idéia é capturar somente os valores máximos das somas dessa consulta. Por se tratar de um "SQL" não muito básico, resolvi compartilhar minha solução utilizando SUM e MAX.

Para exemplificar a situação, vamos adotar uma tabela chamada loja com os valores hipotéticos abaixo:

categoria produto quantidade
Informática Notebook 15
Informática Notebook 20
Informática Mouse 45
Informática Mouse 30
Informática Monitor 25
Informática Monitor 5
Eletrônicos DVD Player 2
Eletrônicos DVD Player 15
Eletrônicos DVD Player 34
Eletrônicos Fone de ouvido 1
Eletrônicos Fone de ouvido 22
Eletrônicos Fone de ouvido 62
Eletrônicos Calculadora 6
Eletrônicos Calculadora 14
Eletrônicos Calculadora 9
Automotivos GPS 3
Automotivos GPS 7
Automotivos GPS 8
Automotivos Rodas 60
Automotivos Rodas 9
Automotivos Alarme 19
Automotivos Alarme 23

Executando a consulta somente com SUM.

SELECT categoria, produto, SUM(quantidade) AS quantidade
FROM loja 
GROUP BY categoria, produto

Obteremos o resultado.

categoria produto quantidade
Informática Notebook 35
Informática Mouse 75
Informática Monitor 30
Eletrônicos DVD Player 51
Eletrônicos Fone de ouvido 85
Eletrônicos Calculadora 29
Automotivos GPS 18
Automotivos Rodas 69
Automotivos Alarme 42

Até agora, não temos complexidade. Só que o resultado desejado é como a tabela abaixo.

categoria produto quantidade
Informática Mouse 75
Eletrônicos Fone de ouvido 85
Automotivos Rodas 69

A consulta seria simples se tivéssemos que exibir somente a coluna categoria e quantidade sem a coluna produto. Pensei em algumas possibilidades, que incluíam o uso do HAVING e WHERE, mas a obrigatoriedade do GROUP BY me fez pensar em outra alternativa. Segue abaixo minha solução.

SELECT a.categoria, a.produto, a.quantidade
FROM (
   SELECT i.categoria, i.produto, SUM(i.quantidade) AS quantidade
   FROM loja i
   GROUP BY i.categoria, i.produto
) AS a
INNER JOIN (
   SELECT t.categoria, MAX(t.quantidade) as quantidade
   FROM (
      SELECT j.categoria, j.produto, SUM(j.quantidade) AS quantidade
      FROM loja j
      GROUP BY j.categoria, j.produto
   ) AS t
   GROUP BY t.categoria
) AS b
ON a.categoria = b.categoria AND a.quantidade = b.quantidade;

Você realizou a consulta de uma forma diferente?! Envie seu comentário e compartilhe conosco.

Grande abraço a todos e até a próxima.

Um comentário:

  1. Sei que faz alguns anos que foi publicado mas me ajudou demais hoje. Obrigado, Fik c Deus!

    ResponderExcluir