You are on page 1of 8

Tecnologias e Linguagens para Banco de Dados II

Aula 5 4328: Agrupando e Resumindo Dados Resumindo dados agrupados (...continuao) Consultas cruzadas

Resumindo Dados Agrupados (...continuao)


ROLLUP, CUBE e GROUPING COMPUTE

ROLLUP, CUBE e GROUPING


Cria um relatrio com subtotais e totais dos dados agregados ROLLUP:
Cria apenas um nvel de agregao, isto , apenas o subtotal por Linha ou por Coluna

GROUPING: Funo de agregao, retorna um ndices que identifica os subtotais CUBE


Cria TODOS OS nveis de agregao possveis, isto , retorna o subtotal por Linha e por Coluna
3

ROLLUP e CUBE
As colunas agrupadas precisam ter alguma relao:
CodProduto
Prateleira

Departamento
Profisso

Exemplo:
Somar todos os produtos por Cdigo e por Prateleira em uma loja

Exemplo2:
Somar os salrios por Departamento e por Cargo em uma empresa
4

Exemplo:
USE AdventureWorks; GO SELECT ProductID, Shelf, SUM(Quantity) AS Qty FROM Production.ProductInventory WHERE ProductID < 6 GROUP BY ProductID, Shelf WITH ROLLUP; ProductID, ROLLUP; GO
Encontre o subtotal por ProductID: Altere a posio de Shelf e ProductID em GROUP BY Adicione o item GROUPING(Shelf) AS TotalProduto na lista do SELECT (separado por vrgula) usando ROLLUP Encontre o subtotal por Shelf: Troque o ROLLUP por CUBE, o CUBE apresentar resultados mais detalhados 5

Resultados: ROLLUP
CodProduto 1 1 1 2 2 2 3 3 3 4 4 4 NULL Prateleira Total A 761 B 324 NULL 1085 A 791 B 318 NULL 1109 A 909 B 443 NULL 1352 A 900 B 422 NULL 1322 NULL 4868
CodProduto 1 2 3 4 NULL 1 2 3 4 NULL NULL Prateleira A A A A A B B B B B NULL Total 761 791 909 900 3361 324 318 443 422 1507 4868

Resultados CUBE
Prateleira A A A A A B B B B B NULL NULL NULL NULL NULL CodProduto 1 2 3 4 NULL 1 2 3 4 NULL NULL 1 2 3 4 Total 761 791 909 900 3361 324 318 443 422 1507 4868 1085 1109 1352 1322
CodProduto 1 2 3 4 NULL 1 2 3 4 NULL NULL 1 2 3 4 Prateleira A A A A A B B B B B NULL NULL NULL NULL NULL Total 761 791 909 900 3361 324 318 443 422 1507 4868 1085 1109 1352 1322

Resultado ROLLUP com GROUPING


Prateleira 1 1 1 2 2 2 3 3 3 4 4 4 NULL CodProduto Total TotalCodProduto A 761 0 B 324 0 NULL 1085 1 A 791 0 B 318 0 NULL 1109 1 A 909 0 B 443 0 NULL 1352 1 A 900 0 B 422 0 NULL 1322 1 NULL 4868 1

CONPUTE...BY...
Sintaxe:
COMPUT {AVG | MAX | MIN | COUNT | SUM}(expressao) BY expressao

ORDER BY obrigatrio (mais de um subtotal) Clusula obsoleta e no padro ANSI BY expressao


Refere-se a um controle de parada ou um subtotal Refere-

Gera um valor semelhante a uma subconsulta


9

Exemplo1: COMPUTE
USE AdventureWorks; GO SELECT SalesOrderID, UnitPrice, UnitPriceDiscount FROM Sales.SalesOrderDetail ORDER BY SalesOrderID COMPUTE SUM(UnitPrice), SUM(UnitPriceDiscount); GO
Experimente comentar a linha ORDER BY
10

Exemplo1: COMPUTE

11

Exemplo2: COMPUTE...BY...
USE AdventureWorks; GO SELECT ProductID, Color, ListPrice FROM Production.Product WHERE Color IN('Blue', 'Silver') ORDER BY Color COMPUTE SUM(ListPrice) BY Color; GO
Experimente comentar a linha ORDER BY Substitua o COMPUTE BY deste exemplo por ROLLUP
12

Consultas Cruzadas
Operadores PIVOT e UNPIVOT Usando operadores de consulta cruzada

Situao Problema
Quantos pedidos cada Funcionrio de cdigo 164, 198, 223, 231, 233 fez para cada Fornecedor? Resoluo:
O cdigo dos Funcionrios sero os rtulos de colunas Cada linha ser identificada pelo cdigo do Vendedor Ao CRUZAR a contagem dos cdigos de pedidos onde o cdigo do vendedor e o do funcionrio sejam os mesmos teremos o total de pedidos por Fornecedor por Funcionrio.

14

Cdigo para a resouluo simples


SELECT EmployeeID, VendorID, COUNT(PurchaseOrderID) AS Total FROM Purchasing.PurchaseOrderHeader WHERE EmployeeID IN(164, 198, 223, 231, 233) GROUP BY VendorID, EmployeeID ORDER BY VendorID; GO
15

Resoluo Simples
VendorID 1 1 1 1 1 2 EmployeeID 164 198 223 231 233 164 Total 4 3 5 4 4 4
16

PIVOT
Torna, uma determinada coluna, piv em uma pesquisa de dados agregados A coluna piv colocada na horizontal, rtulo colunas para que possam ser cruzadas com as demais linhas Sintaxe:
SELECT <lista_campos> || * FROM <expressao_tabela> [AS] <alias>
PIVOT ( <funcao_agregao>(coluna) FOR <coluna_piv> IN(exp1, ..., expN) ) [AS] <alias>
17

Exemplo: PIVOT

18

Exemplo2: Situao problema


Apontar o gasto Anual (2001, 2002, 2003 e 2004) de cada Funcionrio com Frete Os cdigos dos funcionrios sero os cabealhos de linha Os anos (2001, 2002, 2003 e 2004) sero os cabealhos de coluna Os valores de Frete sero somados a cada cruzamento de Funcionrio com Ano
19

Exemplo2: PIVOT
USE AdventureWorks; GO SELECT EmployeeID, CONVERT(VARCHAR(MAX), [2001], 3) AS [2001], CONVERT(VARCHAR(MAX), [2002], 3) AS [2002], CONVERT(VARCHAR(MAX), [2003], 3) AS [2003], CONVERT(VARCHAR(MAX), [2004], 3) AS [2004] FROM (SELECT EmployeeID, YEAR(OrderDate) AS OrderYear, Freight FROM Purchasing.PurchaseOrderHeader) AS ORD PIVOT ( SUM(Freight) FOR OrderYear IN([2001], [2002], [2003], [2004]) ) AS Pvt; GO 20

UNPIVOT
Inverte a funcionalidade do operador PIVOT, torna os cabealhos de colunas dados de um campo O rtulo das colunas torna-se uma coluna, seus dados tornapassam a fazer parte dos registros Sintaxe:
SELECT <lista_campos> || * FROM <expressao_tabela> [AS] <alias>
UNPIVOT ( <coluna> FOR <coluna_unpiv> IN(exp1, ..., expN) ) [AS] <alias>
21

Exemplo: UNPIVO

22

You might also like