Professional Documents
Culture Documents
Aula 5 4328: Agrupando e Resumindo Dados Resumindo dados agrupados (...continuao) Consultas cruzadas
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
CONPUTE...BY...
Sintaxe:
COMPUT {AVG | MAX | MIN | COUNT | SUM}(expressao) BY expressao
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
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: 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