3. AGRUPANDO E
RESUMINDO DADOS
• Usado expressões matemáticas nas cláusulas
SELECT e WHERE;
• A capacidade de executar agrupamentos e dados
resumidos é muito importante para o
desenvolvedor em entrega de relatórios
significativos aos usuários.
• Esta habilidade é feita através de funções
agregadas, geralmente com dados agrupados.
4. AGRUPANDO E
RESUMINDO DADOS
• Funções de agregação são funções que
operam em conjunto, ou linhas, ou dados, em
oposição ao conjunto de funções que operam
sobre valores individuais.
• Funções agregadas podem ser aplicadas de
várias maneiras, incluindo o uso de
agregações personalizadas;
5. Funções de agregação
nativas para o SQL Server
• Podem ser usadas em:
• Na lista de seleção da declaração do SELECT;
• Na cláusula HAVING
7. Funções de agregação
nativas para o SQL Server
• Algumas funções comuns são AVG, MIN, MAX,
SUM, COUNT, GROUPING e VAR;
• Funções de agregação realizam cálculos no
conjunto, ou grupo de valores e retornam um
único valor;
• Note que varias funções de agregação trabalham
com diferentes tipos de dados – para a instância
AVG e SUM somente trabalha com tipos
numéricos;
8. Funções de agregação
nativas para o SQL Server
• Funções de agregação normalmente obtêm seus
conjuntos de valores para trabalhar em via
cláusula GROUP BY. Quando não houver GROUP
BY, as funções que obtém seus grupos em toda a
tabela são filtradas pela cláusula WHERE;
• Funções de agregação podem aparecer na
cláusula declaração SELECT, COMPUTE/COMPUTE
BY e HAVING;
9. Funções de agregação
nativas para o SQL Server
SELECT AVG(TaxRate)
FROM Sales.SalesTaxRate;
SELECT MAX(VacationHours)
FROM HumanResources.Employee;
SELECT MIN(SickLeaveHours)
FROM HumanResources.Employee;
SELECT MAX(VacationHours) as 'MAXVacationHours',
MIN(SickLeaveHours) as 'MINSickLeaveHours'
FROM HumanResources.Employee;
SELECT SUM(VacationHours) AS 'TOTALVacationHours'
FROM HumanResources.Employee;
10. Funções de agregação
nativas para o SQL Server
--Contado todas as linhas da tabela
SELECT COUNT(*)
FROM Production.Product
-- Contando todos os campos que contenham valor em
Weight(Peso)
SELECT COUNT(Weight)
FROM Production.Product
11. Funções de agregação
nativas para o SQL Server
SELECT COUNT(*) FROM PESSOA
SELECT COUNT(*) AS TOT1, COUNT(TELEFONE) AS TOT2 FROM PESSOA
SELECT COUNT(NOME) AS TOT1, COUNT(TELEFONE) AS TOT2 FRM
PESSOA
SELECT COUNT(*) AS TOTOL FROM PESSOA WHERE TELEFONE IS NULL
SELECT COUNT(DISTINCT(ID)) AS TOTOAL FROM COMISSAO
SELECT MAX(SALARIO) AS BIG_ONE FROM PESSOA
SELECT MIM(IDADE) AS MIN_INDADE FROM PESSOA
12. Funções de agregação
nativas para o SQL Server
SELECT MIN(VALOR) AS MENOR, MAX(VALOR) AS MAIOR
FROM COMISSAO
WHERE VALOR > 1000 AND VALOR < 5000
SELECT SUM(VALOR) AS COMISSOES_LISBOA
FROM COMISSAO C, PESSOA P, POSTAL
WHERE C.ID = P.ID AND
CODIGO = COD_POSTAL AND
LOCALIDADE = 'LISBOA'
SELECT SUM(VALOR) AS COMISSOES, SUM(VALOR * 0.19) AS VALOR
FROM COMISSAO
13. Funções de agregação
nativas para o SQL Server
SELECT SUM(VALOR) AS COMISSOES, SUM(VALOR * 0.19) AS VALOR
FROM COMISSAO
SELECT AVG(IDADE) AS MEDIA_IDADES
FROM PESSOAS
SELECT AVG(SALARIO)
FROM PESSOA
WHERE IDADE > 30
14. Usando funções de
agregação com valores
NULL
• A maioria das funções de agregação
ignoram valores NULL;
• Valores NULL podem produzir um
inesperado ou um resultado incorreto;
• User a função ISNULL para corrigir esse
problema;
15. Usando funções de
agregação com valores
NULL
-- Consulta sem utilizacao do ISNULL
-- Reusultado: 74.06
SELECT AVG(Weight) AS 'AvgWeight'
FROM Production.Product
-- Consulta com utilizacao do ISNULL
-- Reusultado: 30.12
SELECT AVG(ISNULL(Weight,0)) AS 'AvgWeight'
FROM Production.Product
-- Valores nulos sendo substituidos por zero, sendo
incluidos na contagem
SELECT COUNT(ISNULL(Weight,0))
FROM Production.Product
16. Usando funções de
agregação com valores
NULL
• A função COUNT(*) é uma exceção de função e
retorna o número total de registros na tabela;
17. Usando a cláusula
GROUP BY
• Especifica os grupos em que as linhas de resultado
devem ser colocadas;
• Calcula valores totais para funções de agregação;
SELECT SalesOrderID, SUM(LineTotal) as SubTotal
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
ORDER BY SalesOrderID
18. Usando funções de
agregação com valores
NULL
• Ao executar agrupamento em uma consulta, os
registros das colunas são agrupados por colunas
listadas na cláusula GROUP BY. É esse grupo que
criam os conjuntos de funções de agregação.
Portanto, se você deseja somar o campo
LineTotal para cada registro da tabela
SalesOrderDetail, você deveria agrupar em uma
coluna que identifica unicamente cada ordem de
venda, nesse caso a coluna SalesOrderID;
19. Usando funções de
agregação com valores
NULL
• Ao usar a cláusula GROUP BY, todas as colunas na lista
SELECT que não fazem parte de uma expressão de
agregação será usado para agrupar os resultados por
meio da cláusula GROUP BY. Se você não deseja agrupar
uma coluna, não a coloque no SELECT;
• Valores NULL são incluídas no agrupamento de uma
coluna - todos os valores NULL são considerados iguais e,
assim, colocado em seu próprio grupo;
20. Usando funções de
agregação com valores
NULL
SELECT ID, SUM(VALOR) AS TOTAL
FROM COMISSAO
GROUP BY ID
SELECT NOME, SUM(VALOR) AS TOTAL
FROM PESSOA P, COMISSAO C
WHERE P.ID = C.ID
GROUP BY NOME
SELECT NOME, SUM(VALOR) + SALARIO AS TOTAL
FROM PESSOA P, COMISSAO C
WHERE P.ID = C.ID
GROUP BY NOME, SALARIO
21. Usando funções de
agregação com valores
NULL
SELECT ID, MAX(VALOR) AS MAIOR
FROM COMISSAO
GROUP BY ID
SELECT ID, COUNT(*) FROM N_COMISSOES
FROM COMISSAO
GROUP BY ID
SELECT MENSAGEM, SUM(VALOR) AS TOTAL
FROM COMISSAO C, MENSAGEM M
WHERE M.ID = C.ID_MSG
GROUP BY MENSAGEM
ORDER BY 2 DESC
22. Filtrando dados agrupados
usando a cláusula HAVING
• Especifica uma condição de pesquisa para um
grupo;
• Pode ser usada somente com a cláusula
SELECT;
SELECT SalesOrderID, SUM(LineTotal) AS SUBTOTAL
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
HAVING SUM(LineTotal) > 100000.00
ORDER BY SalesOrderID
23. Filtrando dados agrupados
usando a cláusula HAVING
• A cláusula HAVING é opcional que pode ser usado para
diminuir o conjunto de resultados configurados por
critérios nos valores de agregação, efetivamente
repassando a cláusula WHERE;
•
• A cláusula HAVING é usada para filtrar linhas após o
agrupamento que foi aplicado, antes que os resultados
sejam retornados para o cliente;
•
• Você pode somente incluir expressões agregadas e
colunas que são listadas na cláusula GROUP BY;
24. Filtrando dados agrupados
usando a cláusula HAVING
• É uma prática utilizar o resultado agregado utilizando a cláusula
HAVING, e não na cláusula WHERE;
SELECT ID, SUM(VALOR) AS TOTAL
FROM COMISSAO
GROUP BY ID
HAVING SUM(VALOR) > 1000
SELECT NOME, MAX(ID_MSG)
FROM PESSOA P, COMISSAO C
WHERE P.ID = C.ID
GROUP BY NOME
HAVING MAX(ID_MSG) > 35