Group by

Alguém tem um exemplo de como usar o group by …?
não esou encontrando bons exemplos na net…
alguém tem um bom exemplo para min passar que seja fácil de enteder…

http://www.w3schools.com/sql/sql_groupby.asp

Cara esse ai eu já vi entendi nada…!

Suponha que você tem uma tabela que armazena informações sobre alunos de uma faculdade, sendo que esta tabela foi criada com o comando abaixo:

create table alunos(matricula varchar2(9), nome varchar2(50), periodo number, av1 number, av2 number, primary key(matricula));

Suponha então que você quer ver a menor e a maior nota de cada período, assim como a média geral dos alunos do período:

select periodo, min((av1 + av2) / 2) Min, max((av1 + av2) / 2) Max, avg((av1 + av2) / 2) Media from alunos group by periodo;

Agora suponha que você queira visualizar novamente a nota mínima, máxima e a média de cada período, mas só devem ser considerados os alunos cujo nome começar com a letra A;

select periodo, min((av1 + av2) / 2) Min, max((av1 + av2) / 2) Max, avg((av1 + av2) / 2) Media from alunos where nome like 'A%' group by periodo;

Por fim, suponha que agora você ira fazer a mesma consulta, só que adicionando uma condição: só devem ser considerados os periodos que tiverem mais de 20 alunos.

select periodo, min((av1 + av2) / 2) Min, max((av1 + av2) / 2) Max, avg((av1 + av2) / 2) Media from alunos where nome like 'A%' group by periodo having count(*) >= 20

Ou seja, o group by serve para agrupar os resultados de uma consulta de acordo com uma coluna especificada. Além disso, você pode impor condições para os agrupamentos através do having.

Espero que tenha entendido, e, como ainda não sou muito bom em SQL, caso eu tenha errado alguma coisa alguém por favor me corrija.

P.S.: Acima eu considerei que as instruções sejam executadas no Oracle.

Só se usa group by quando se tem uma função de agregação? E é sempre necessário, nesses casos?

Você pode usar o group by sem uma função de agregação, mas em geral não faz muito sentido. Exemplo:

select matricula from aluno group by matricula;

E você pode usar uma função de agregação sem o group by, mas, dependendo do SGBD, você deve usar o group by se usar mais de uma função de agregação. Exemplo:

select min((av1 + av2)/2) Menor_Media, max((av1 + av2) / 2) Maior_Media from aluno;

O Oracle é um exemplo de um SGBD que permite usar mais de uma função de agregação sem ter que usar o group by, sendo assim, a instrução acima executa perfeitamente nele.