You are on page 1of 11

Tecnologias e Linguagens para Banco de Dados II

Aula 4 4328: Agrupando e Resumindo Dados Funes de agregao Resumindo dados agrupados

Funes de Agregao
Usando funes de agregao Funes de agregao com valores NULL

Funes de agregao
A partir de uma lista de valores a funo efetua um clculo e retorna um nico valor Funes de agregao ignoram valores NULL
Exceto COUNT(*)

Normalmente implementadas com a clusula GROUP BY Todas as funes de agregao so deterministas


Exceto as funes personalizadas

Funes de agregao so usadas apenas na lista de valores da clusula SELECT ou como uma subconsulta
3

Funo AVG (Mdia)


Sintaxe: AVG([ALL||DISTINCT] expressao) ALL
Inclui todas as colunas

DISTINCT
Inclui apenas valores distintos (diferentes entre si)

expressao
Qualquer valor do tipo nmero, exceto BIT

Exemplo: AVG
USE AdventureWorks; GO SELECT AVG(VacationHours) AS 'Horas de Descanso', SUM(SickLeaveHours) AS 'Horas Doente' FROM HumanResources.Employee WHERE Title LIKE 'Vice President%'; GO
5

Funo COUNT(exp) Contar


Sintaxe: COUNT({[ALL||DISTINCT]exp||*}) COUNT(ALL exp)
Conta e retorna a quantidade de valores no NULL em exp. exp.

COUNT(DISTINCT exp)
Conta e retorna a quantidade de valores distintos no NULL em exp. exp.

exp
Expressao de qualquer tipo de dado, exceto UNIQUE, IDENTIFIER, TEXT, IMAGE, NTEXT

Retorna um valor do tipo INT COUNT(*)


Retorna um nmero inteiro que representa a quantidade de linhas em uma tabela
6

Exemplos COUNT
COUNT(DISTINCT expressao)
USE AdventureWorks; GO SELECT COUNT(DISTINCT Title) FROM HumanResources.Employee; GO

COUNT(*)
USE AdventureWorks; GO SELECT COUNT(*) AS 'Total de Registros' FROM HumanResources.Employee; GO
7

Funo MAX
Sintaxe: MAX(ALL||DISTINCT expressao) Comando DISTINCT no significante Retorna, o valor mximo contido em expresso. expressao
Constante, nome de coluna ou expresso

Retorna o mesmo tipo de dado da coleo analisada na expresso.


8

Funo MIN
Sintaxe: MIN(ALL||DISTINCT expressao) O comando DISTINCT no significante Retorna, o valor mnimo contido em expresso. expresso. expressao
Constante, nome de coluna ou expresso

Retorna o mesmo tipo de dado da coleo analisada na expresso.


9

Exemplo MIN e MAX


Exemplo MIN
USE AdventureWorks; GO SELECT MIN(TaxRate)AS 'Mnimo' FROM Sales.SalesTaxRate; GO

Exemplo MAX
USE AdventureWorks; GO SELECT MAX(TaxRate)AS 'Mximo' FROM Sales.SalesTaxRate; GO
10

Funo SUM
S pode ser usada com valores do tipo nmero Sintaxe: SUM(ALL||DISTINCT expressao) Retorna a soma dos valores contidos em expressao. expressao.

11

Exemplo SUM
USE AdventureWorks; GO SELECT Color, SUM(ListPrice) AS 'Total de Preo', SUM(StandardCost) AS 'Custo Total' FROM Production.Product WHERE Color IS NOT NULL AND ListPrice != 0.00 AND Name LIKE 'Mountain%' GROUP BY Color ORDER BY Color; GO
12

Funes de Agregao com Valores NULL


Quanto a mdia de 2, 3 e 4? M = (2+3+4)/3 M = 3 Quanto a mdia de 2, NULL, 3 e 4? M = (2+NULL+3+4)/4 M = 2,25 Como usar funes gregadas onde pode se ter valores NULL?

13

Exemplo: Valores NULL


Funo AVG com valores incorretos
USE AdventureWorks; GO SELECT AVG(Weight) AS 'Peso Mdio' FROM Production.Product; --Retorno: 74,07 --Retorno:

Correo da funo com ISNULL


USE AdventureWorks; GO SELECT AVG(ISNULL(Weight, 0)) AS 'Peso Mdio' FROM Production.Product; GO --Retorno: 30,13 --Retorno:
14

Exemplo: COUNT(*)
O COUNT conta todas as linhas, independente de valores NULL. Exemplo:
USE AdventureWorks; GO SELECT COUNT(*) AS [Contador de Linhas] FROM Production.Product; GO --Retorno: 504 --Retorno:
15

Resumindo Dados Agrupados


Clusula GROUP BY Filtrando dados agrupados com HAVING

Usando GROUP BY:


Especifica campos pelos quais os registros sero agrupados
Se funes de agregao forem incluida na clausula SELECT:
GROUP BY ir resumir as linhas de valores para cada campo calculado

Ao especificar GROUP BY:


Cada coluna listada em SELECT
Que no esteja contida em alguma funo de agregao

Deve ser incluida entre as colunas listadas em GROUP BY

17

Usando GROUP BY:


Sintaxe:
GROUP BY [ALL] expressao1[, ..., expressaoN] [WITH {CUBE|| ROLLUP}]

ALL
Retorna o agrupamento de todas as linhas que atendem a comparao (onde a comparao e positiva) Valores NULL so agrupados nas condies onde o critrio de comparao negativo. Pode ser usado apenas quando o comando inclui WHERE No pode ser usado quando a clausula GROUP BY inclui CUBE ou ROLLUP
18

Usando GROUP BY:


expressao
Expressao que contem os dados a serem agrupados Coluna de tabela definida na clausula FROM

ROLLUP
Cria apenas um nvel de agregao (Subtotal) por linha ou por coluna

CUBE
Cria mais de um nvel de agregao (Subtotal) por linha e por coluna
19

Exemplo1: GROUP BY
USE AdventureWorks; GO SELECT Size, AVG(ListPrice) AS 'Preo Mdio' FROM Production.Product GROUP BY Size ORDER BY Size; GO Obs: Tire a funo de agregao (o cdigo no funciona sem ela)
Coloque a funo de agregao de volta
20

Exemplo2: GROUP BY
USE AdventureWorks; GO SELECT COUNT(EmployeeID) AS 'Funcionrios', Department FROM HumanResources.vEmployeeDepartment GROUP BY Department ORDER BY Department; GO
Obs: Ordenar facilita o trabalho com o resultado da consulta. Experimente omitir a clausula ORDER BY
21

Exemplo3: GROUP BY
USE AdventureWorks; GO SELECT COUNT(CustomerID) AS 'Clientes', CustomerType FROM Sales.Customer GROUP BY CustomerType; GO
Obs: GROUP BY faz parte do comando SELECT, coloque o ponto e virgula aps Customer na clausula FROM e veja que ele no funciona.
22

Exemplo4: GROUP BY
USE AdventureWorks; GO SELECT Color, AVG(ListPrice) AS Lista FROM Production.Product WHERE ProductNumber = 'FR-R72R-58' 'FR- R72RGROUP BY ALL Color; GO Obs: Tire o ALL (os valores NULL no so listados sem o ALL) Obs2: Coloque o ProductNumber na lista de campos do comando SELECT
Um campo que no tem funo de agregao ou no est listado na clusula GROUP BY impede que a realizao da consulta. Tire o campo colocado na lista do SELECT!
23

Filtrando dados agrupados com HAVING


Filtra os dados agrupados com GROUP BY A clausula HAVING semelhante ao WHERE Sintaxe:
HAVING <condicao>

condicao
Especifica as condies de busca para dados agrupados ou funes de agregao

Ordem de uso:
1. WHERE 2. GROUP BY 3. HAVING
24

Exemplo1: HAVING
USE AdventureWorks; GO SELECT ProductID, AVG(OrderQty) AS 'Qtd Mdia', SUM(LineTotal)AS 'Total' FROM Sales.SalesOrderDetail WHERE ProductID BETWEEN 780 AND 790 GROUP BY ProductID HAVING SUM(LineTotal) > $200000 AND AVG(OrderQty) < 3; GO
25

Resultado 1 HAVING
ProductID Qtd Media 782 785 780 788 783 786 789 2 3 2 3 2 3 2 Total 4400592.800400 442477.086952 3438478.860423 479071.900108 4009494.761841 501648.875060 1448122.478985
26

Mudando os Critrios de Seleo do HAVING


USE AdventureWorks; GO SELECT ProductID, AVG(OrderQty) AS 'Qtd Mdia', SUM(LineTotal)AS 'Total' FROM Sales.SalesOrderDetail WHERE ProductID BETWEEN 780 AND 790 GROUP BY ProductID HAVING ((SUM(LineTotal) > $4000000) AND (AVG(OrderQty) < 3)); GO
27

Resultado 2 HAVING
ProductID Qtd Media 782 785 780 788 783 786 789 2 3 2 3 2 3 2 Total 4400592.800400 442477.086952 3438478.860423 479071.900108 4009494.761841 501648.875060 1448122.478985
28

Exemplo1: HAVING
USE AdventureWorks; GO SELECT ProductID, SUM(OrderQty) 'Qtd Pedido' FROM Purchasing.PurchaseOrderDetail GROUP BY ProductID HAVING SUM(OrderQty) < 45; GO Experimente comentar o HAVING e colocar o critrio de comparao em uma clausula WHERE
WHERE SUM(OrderQty) < 45
29

Exemplo2: HAVING
USE AdventureWorks; GO SELECT ProductCategoryID, COUNT(ProductSubcategoryID) AS 'Qtd Produtos' FROM Production.ProductSubcategory GROUP BY ProductCategoryID HAVING COUNT(ProductSubcategoryID) = 14; GO
30

10

Exemplo3: HAVING
USE AdventureWorks; GO SELECT LocationID, SUM(Quantity) AS 'Qtd Total' FROM Production.ProductInventory GROUP BY LocationID HAVING SUM(Quantity) < 1000; GO
31

HAVING vs WHERE
HAVING Estabelece condies para a clusula GROUP BY A condio de pesquisa com HAVING aplicada APS o agrupamento A sintaxe da clusula HAVING pode conter funes de agregao HAVING pode se referir a qualquer coluna WHERE Estabelece condies para o comando SELECT A condio de pesquisa com WHERE aplicada ANTES do agrupamento A sintaxe da clusula WHERE NO pode ter funes de agregao WHERE pode se referir a qualquer coluna

32

11