Salve, salve meus amigos! Vamos para mais um dia de treinamento. Nesse momento de pandemia, espero que todos estejam bem e cuidando-se pois não podemos dar mole para o Corona!
No post de hoje vamos falar sobre as possibilidades de agrupamento, agregação e ordenação dos dados. Espero que gostem, pois está bem interessante!
Funções de Agregações
Quando estamos trabalhando com análise de dados ou até mesmo dentro de uma aplicação, em alguns casos, surge a necessidade de informações resumidas. Quando falamos em gerar relatório de vendas pode ocorrer a necessidade em obter as informações de diversas formas, por exemplo: menor/maior venda do dia, qual o produto mais vendido, quem foi o vendedor que performou melhor e outros. Quando trazemos essa necessidade para o mundo da tecnologia, mais precisamente para os bancos de dados, a linguagem SQL (em todos os SGDBs do mercado) possui diversas funções nativas que foram desenvolvidas para atender situações como essa.
Neste tópico, iremos abordar as principais e mais usadas funções de agregação da linguagem SQL MIN, MAX, SUM, COUNT e AVG. Destaco que podem existir outras, porém iremos abordar apenas estas, por enquanto.
Para maiores detalhes, deixo abaixo um link onde é possível analisar a documentação oficial do Microsoft SQL Server.
Link Funções de Agregação: https://docs.microsoft.com/pt-br/sql/t-sql/functions/aggregate-functions-transact-sql?view=sql-server-ver15
Sintaxe das Funções de Agregação
Após uma breve introdução ao assunto, vamos aprofundar no entendimento. Destaco uma definição bem bacana que encontrei no site DevMidia a respeito das funções de agregação, onde eles falam:
"Uma função de agregação processa um conjunto de valores contidos em uma única coluna de uma tabela e retorna um único valor como resultado. Sua sintaxe é semelhante aquela encontrada em muitas linguagens de programação. Contudo, o parâmetro informado é sempre a coluna cujos valores desejamos processar." Fonte:Site www.devmidia.com.br https://www.devmedia.com.br/sql-funcoes-de-agregacao/38463
A sintaxe de todas as funções que vamos abordar são bem semelhantes. Analise o exemplo abaixo.
tipo_de_funcao(coluna)
Agora vamos falar para as exceções qual seria a regra. Em uma única query podemos informar uma ou mais funções de agregação, observe o exemplo abaixo.
Exemplo 01 - Precisamos montar uma query para responder a seguinte pergunta. Qual o total de cargos e a quantidade de vagas que estão disponíveis para o estado do Rio de Janeiro.
-- # Script consulta quantidade de cargos e total de vagas para estado do Rio de Janeiro
SELECT
COUNT(CD_CARGO) QTD_CARGOS
,SUM(QT_VAGAS) TOTAL_VAGAS
FROM dbo.VAGAS_DISPONIVEIS
WHERE SG_UF = 'RJ';
Hora de comentar um pouco sobre cada uma delas.
Função de Agregação MAX()
Olhando apenas para essa função é fácil falar o que ela faz. Essa função analisa um conjunto de valores de uma coluna e retorna o maior entre eles.
Exemplo 02 - Escreva uma consulta para retornar o CARGO que possui o maior código.
-- # Script consulta o cargo que tem o maior código de cadastro
SELECT
MAX(CD_CARGO) CD_CARGO
FROM dbo.VAGAS_DISPONIVEIS;
Função de Agregação MIN()
Essa ficou fácil, hein! Ela é o oposto da função MAX(). Se a função MA() retorna o maior valor, a função MIN() analisa um conjunto de valores de uma coluna e retorna o menor entre eles.
Exemplo 03 - Escreva uma consulta para retornar o CARGO que possui o menor código.
-- # Script consulta o cargo que tem o menor código de cadastro
SELECT
MIN(CD_CARGO) CD_CARGO
FROM dbo.VAGAS_DISPONIVEIS;
Função de Agregação SUM()
Podemos dizer que a função SUM() é utilizada quando queremos realizar a soma dos valores em uma única coluna ou entre colunas e retorna esse resultado.
Exemplo 03 - Escreva uma consulta para somar todos as vagas disponíveis para estado o Rio de Janeiro.
-- # Script consulta total de vagas no estado do Rio de Janeiro
SELECT
SUM(QT_VAGAS) TOTAL_VAGAS
FROM dbo.VAGAS_DISPONIVEIS
WHERE SG_UF = 'RJ';
Vamos para o momento dicas!
- Não é possível utilizar a função SUM() para colunas com datatype do tipo String (char, nchar, varchar, nvarhcar, text, ntext);
- Por padrão, a função SUM() ignora valores do tipo null.
Função de Agregação AVG()
Está ficando bom! A função AVG() é responsável por calcular a média aritmética dos valores em uma única coluna.
Exemplo 04 - Escreva uma consulta para retornar a média das vagas disponíveis.
-- # Script consulta média de vagas
SELECT
AVG(QT_VAGAS) TOTAL_VAGAS
FROM dbo.VAGAS_DISPONIVEIS;
Momento dica!
Por padrão a função AVG() ignora valores do tipo null.
Função de Agregação COUNT()
Chegamos no final! A função COUNT() retorna o valor total de linhas da tabela e não especifico para uma coluna. Para ter uma ótima performance, é aconselhado dentro dos parênteses colocar uma coluna com índice cluster, por mais que seja o total de linhas de uma tabela. Você pode também informar dentro dos parênteses um asterisco.
Exemplo 05 - Escreva uma consulta para contar a quantidade de registros de vaga para o estado do Rio de Janeiro.
-- # Script consulta quantidade de linhas (registros) na tabela vagas
SELECT
COUNT(1) TOTAL_VAGAS
FROM dbo.VAGAS_DISPONIVEIS
WHERE SG_UF = 'RJ';
Momento Dica!
Quando informado o nome de uma coluna, valores do tipo null são ignorados, porém quando informado "*" (asterisco) todas as linhas serão contabilizadas.
Link Funções de Agregação: https://docs.microsoft.com/pt-br/sql/t-sql/functions/aggregate-functions-transact-sql?view=sql-server-ver15
Cláusula de Agrupamento
Ao comentarmos sobre as cláusulas de agrupamento GROUP BY e HAVING, vocês entenderão que cláusula HAVING será como um PLUS para as funções de agrupamento quando precisarmos aplicar algum filtro em uma coluna agrupada.
Agora vamos passar por cada uma das duas! Me acompanhem...
Cláusula GROUP BY
Passeando pela internet em busca de materiais bacanas para enriquecer nossos estudos, deparei com mais um artigo da revista Devmedia que define de forma bem clara e objetiva a cláusula GROUP BY.
"Ao utilizar a cláusula GROUP BY dividimos os registros que serão agregados em grupos de valores. Essa mudança faz com que tenhamos mais de uma linha como resultado, pois o processamento será realizado uma vez sobre cada um desses grupos." Fonte: Site https://www.devmedia.com.br/sql-funcoes-de-agregacao/38463
Definição clara, vamos agora explicar como que tudo isso funciona em linhas de código. Preste atenção nesse exemplo.
Exemplo 06 - Preciso criar uma consulta para retornar quantas vagas existem por cargo para o estado do Rio de Janeiro:
-- # Script consulta total de vagas por cargos do estado do Rio de Janeiro
SELECT
DS_CARGO
,SUM(QT_VAGAS) TOTAL_VAGAS
FROM dbo.VAGAS_DISPONIVEIS
WHERE SG_UF = 'RJ'
GROUP BY DS_CARGO;
Conforme apresentado acima, o que antes era retornado apenas em uma única linha, quando totalizamos a quantidade de vagas, nesse exemplo colocamos um nível de abertura por cargos.
Lembrando que podemos colocar quantas colunas acharem necessário, porém para que seu script funcione com sucesso, todas essas colunas devem ser informadas após a cláusula GROUP BY.
Analisem com atenção a sintaxe do comando SELECT usando a cláusula GROUP BY.
# Sintaxe comando GROUP BY
SELECT [ coluna1, coluna2, ... | * ]
,[ funcao_de_agregacao ] funcao_de_agregacao
FROM [ tabela ]
GROUP BY [ coluna1, coluna2, ... | * ]
Cláusula HAVING
Essa cláusula pode ser usada ou não em conjunto com a cláusula GROUP BY. Sempre que precisarmos obter resultados em que o filtro seja feito sobre uma coluna que for submetida a agregação, é obrigatório o seu uso.
Bonita definição Fernandinho, mas não entendi nada! Seja mais claro, por favor!
Claro meu jovem, vamos então detalhar isso. Se liga nesse exemplo.
Exemplo 07 - Preciso criar uma consulta para retornar todos os cargos que possuem mais de 200 vagas disponíveis para o estado do Rio de Janeiro.
Dica, você precisa primeiro descobrir o total de vagas por cargo no estado do Rio de Janeiro e somente depois filtrar os cargos que possuem mais de 200 vagas. Boa sorte!
-- # Script consulta cargos que possuem TOTAL de vagas maior que 200
SELECT
DS_CARGO
,SUM(QT_VAGAS) TOTAL_VAGAS
FROM dbo.VAGAS_DISPONIVEIS
WHERE SG_UF = 'RJ'
GROUP BY DS_CARGO
HAVING SUM(QT_VAGAS) > 200;
Observem que a cláusula HAVING será sempre o último nível dentro do nosso SELECT.
Em consultas TSQL não é possível criar esse mesmo filtro utilizando a clausula Where. Nesse caso, o filtro deverá aplicado na cláusula HAVING.
Link Cláusula Group By: https://docs.microsoft.com/pt-br/sql/t-sql/queries/select-group-by-transact-sql?view=sql-server-ver15
Link Cláusula Having: https://docs.microsoft.com/pt-br/sql/t-sql/queries/select-having-transact-sql?view=sql-server-ver15
Links de referência:
Cláusula de Ordenação
Para finalizar esse tópico, vamos falar agora sobre uma cláusula de ordenação muito usada quando escrevemos consultas. Essa cláusula recebe o nome de ORDER BY, sua principal e única utilidade é, organizar os resultados de acordo com uma ou mais colunas da tabela onde essa organização ou ordenação possa ser em ordem crescente ou decrescente.
Por default, quando não especificado a ordenação sempre ocorrerá na forma crescente.
De modo geral, quando ordenamos os resultados de uma consulta, essa arrumação pode ser super útil não só para a exibição do seu resultado na forma ascendente ou decrescente, mas até mesmo na utilização em conjunto as funções de limitação de resultados para obter o maior ou menor valor de uma determinada consulta.
# Sintaxe cláusula ORDER BY
SELECT [ coluna1, coluna2, ... | * ]
FROM [ tabela ]
ORDER BY [ coluna1, coluna2 ] [ DESC | ASC ]
Vamos acompanhar esse exemplo.
Exemplo 08 - Preciso criar uma consulta que retorne a lista de vagas existentes para todo o território brasileiro e ordene os resultados da consulta pela coluna QT_VAGAS. Como retorno, preciso saber qual o estado (SG_UF), o cargo (DS_CARGO) e a quantidade de vagas (QT_VAGAS). Utilize a opção ASC em conjunto ao ORDER BY:
-- # Script consulta dados ordenado de forma crescente pela coluna QT_VAGAS
SELECT
SG_UF
,DS_CARGO
,QT_VAGAS
FROM dbo.VAGAS_DISPONIVEIS
ORDER BY QT_VAGAS ASC;
E para finalizar, a ordenação ela pode ocorrer por várias colunas, basta você definir quais serão ordenadas.
Momento de Dica:
Vamos voltar um pouquinho e analisar a última query. Observe que definimos que a coluna SG_UF é a primeira coluna, DS_CARGO é a segunda coluna e a QT_VAGAS a terceira coluna e indo para o final da nossa query, na cláusula ORDER BY definimos que os registros deverão ser ordenadas de forma crescente pela coluna QT_VARGAS.
Pois bem, essa ordenação pode ser feita de outra forma sem alterar o resultado. Vamos ao exemplo.
-- # Script consulta dados ordenado de forma crescente pela coluna QT_VAGAS, porém apontando para a posição da coluna
SELECT
SG_UF
,DS_CARGO
,QT_VAGAS
FROM dbo.VAGAS_DISPONIVEIS
ORDER BY 3 ASC;
Você pode informar o número da coluna que quer ordenar. Porém peço bastante cautela, com isso, pois caso as colunas mudem de ordem ou seja acrescida outra coluna antes da SG_UF, os registros serão ordenados de forma errada.
Esse é a mesma precaução que devemos ter quando realizamos um INSERT INTO sem especificar as colunas. Esse é mais um da série aprecie com moderação.
Então meus amigos terminamos aqui mais um post. Abaixo deixo para vocês abaixo o arquivo com todos os scripts usados nesse tópico! Espero que tenham curtido. Bons estudos!
Link Cláusula Order By: https://docs.microsoft.com/pt-br/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-ver15
Comentarios