Para compreendermos melhor o uso do GROUP BY, considere a tabela Produtos (lembrando que os valores associados aos nomes são fictícios e são apenas usados para este exemplo):

img

Vamos supor que desejemos obter o número de produtos em estoque, agrupados pelo tipo, para que depois seja feita a soma da quantidade existente em cada um dos grupos. Para isso usamos a função SUM() em conjunto com o GROUP BY, como a instrução a seguir nos mostra:


SELECT Tipo, SUM(Quantidade) AS 'Quantidade em Estoque'
FROM Produtos
GROUP BY Tipo

Executando a instrução acima temos o seguinte resultado:

img

Podemos também contar o número de produtos em estoque de acordo com os fabricantes disponíveis. Assim como no exemplo anterior, mais agora levando em conta os fabricantes, os produtos devem ser agrupados por eles, para que depois sejam contabilizados os produtos em relação a essa divisão. Para isso, devemos usar a seguinte instrução:


SELECT Fabricante, SUM(Quantidade) AS 'Quantidade em Estoque'
FROM Produtos
GROUP BY Fabricante

Assim temos o seguinte resultado:

img

Agora vamos somar a quantidade de produtos em estoque de acordo com os tipos e fabricantes disponíveis. Primeiro, será agrupados os produtos de acordo com os tipos e fabricantes, para que depois seja feita a soma de cada um desses grupos (essa é a ordem que o SQL Server faz logicamente, mais nossa instrução segue a ordem inversa). Confira como fazer isso a seguir:


SELECT Tipo, Fabricante, SUM(Quantidade) AS 'Quantidade em Estoque'
FROM Produtos
GROUP BY Tipo, Fabricante

Assim teremos este resultado:

img

Podemos também obter o valor total dos produtos em estoque, agrupados por tipo. Veja como:


SELECT Tipo, SUM(Quantidade * VlUnitario) AS 'Valor do Estoque'
FROM Produtos
GROUP BY Tipo

Temos o seguinte resultado:

img

Deixo como dica para vocês experimentarem fazer outras combinações com o GROUP BY em conjunto com as funções descritas anteriormente, visando assim treinar os conceitos apresentados até aqui.

Cláusula HAVING com GROUP BY – A cláusula HAVING determina uma condição de busca para um grupo ou um conjunto de registros, definindo critérios para limitar os resultados obtidos a partir do agrupamento de registros. É importante lembrar que essa cláusula só pode ser usada em parceria com GROUP BY.


SQL nível Jedi: Subqueries
  • Um bate papo sobre Subqueries:
    Grande parte dos desenvolvedores recorrem somente ao JOIN para resolver consultas que envolvem múltiplas tabelas. Hoje falaremos sobre uma outra ferramenta para isso que pode resolver cenários em que o JOIN não atenda, as subqueries.

Primeiros passos no SQL

  • Eu preciso aprender SQL?:
    SQL é a linguagem padrão para acesso a dados em bancos relacionais. Por conta disso, é através dela que iniciamos nossos primeiros diálogos com os SGBDs, sistemas gerenciadores de bancos de dados.

A cláusula GROUP BY pode ser empregada, entre outras finalidades, para agrupar os produtos de acordo com cada tipo existente. Dentro de cada um dos grupos, a cláusula HAVING pode ser usada para restringir apenas os registros que possuem uma quantidade superior a 200 unidades no estoque, por exemplo.

Obs: O HAVING é diferente do WHERE. O WHERE restringe os resultados obtidos sempre após o uso da cláusula FROM, ao passo que a cláusula HAVING filtra o retorno do agrupamento.

Para fazermos o filtro conforme especificado acima, devemos usar a seguinte instrução:


SELECT Tipo, SUM(Quantidade) AS 'Quantidade em Estoque'
FROM Produtos
GROUP BY Tipo
HAVING SUM(Quantidade) > 200

Assim teremos o seguinte resultado:

img

Perceba que este tipo de filtragem nos retornou apenas 2 registros, que são os tipos que, somados, ultrapassam o valor de 200 unidades em estoque.

Outro exemplo: vamos agrupar os produtos com base nos tipos e fabricantes disponíveis. Logo após, retornaremos apenas os registros cuja quantidade supera novamente as 200 unidades em estoque. Veja a instrução e o resultado a seguir:


SELECT Tipo, Fabricante, SUM(Quantidade) AS 'Quantidade em Estoque'
FROM Produtos
GROUP BY Tipo, Fabricante
HAVING SUM(Quantidade) > 200
img

Note que agora temos 3 registros. Vamos agora fazer um exemplo mais complexo: vamos supor que o agrupamento deverá ser feito pelo Nome. Dentro deste agrupamento, desejamos obter apenas aqueles cuja quantidade novamente supera as 200 unidades em estoque e cujo valor estocado seja igual ou superior a 100 mil. Veja como fazer a seguir, e seu resultado:


SELECT Nome, SUM(Quantidade) AS 'Quantidade em Estoque', SUM(Quantidade * VlUnitario) AS 'Valor em Estoque'
FROM Produtos
GROUP BY Nome
HAVING SUM(Quantidade) > 200 AND SUM (Quantidade * VlUnitario) >= 10000.00
img