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.