Querying Microsoft SQL
Server 2012
Exam 70-461
Capítulo 5 – Grouping and Windowing

Julián Castiblanco P.
http://julycastiblanco.blogspot.com/
Julian_castiblancop@hotmail.com
MCT-MCSA-MCITP-MCTS SQL Server 2008/2005

Líder ITPros-DC
Material de trabajo
Windows Server 2012 trial
http://www.microsoft.com/en-us/download/details.aspx?id=11093
SQL Server 2012 with SP1 trial
http://www.microsoft.com/en-us/download/details.aspx?id=29066
AdventureWorks for SQL Server 2012
http://msftdbprodsamples.codeplex.com/releases/view/55330
Training kit SQL Server
Querying Microsoft SQL Server 2012 – exam 70-461
http://www.amazon.com/Training-Kit-Exam-70-461Microsoft/dp/0735666059/ref=sr_1_1?ie=UTF8&qid=1359206206&sr=81&keywords=querying+microsoft+sql+server+2012+training+kit+exam+70-461
Agenda
• Consultas Agrupadas
• Pivot and Unpivot
• Función de agregación especiales
Consultas Agrupadas
Las consultas básicas nos ayudan a
responder preguntas de detalle, por
ejemplo qué clientes realizaron
compras el día de hoy? O cuales
facturas han sido vendidas en el mes
y por qué valor.

Las agrupaciones dan un sentido más
analítico a las consultas, responden
preguntas como, cuantos clientes tengo?
Cuanto dinero he ganado/perdido en el
transcurso del año por producto?
Consultas Agrupadas

Funciones
Distinct

Having

•
•
•
•
•

Count()
Sum()
Average()
Max()
Min()

Group by

http://technet.microsoft.com/en-us/library/ms173454.aspx

•
•
•
•
•

stdev()
stdevp()
Grouping()
Grouping_id()
var()
Consultas Agrupadas
A cuanto asciende el valor de las ordenes y cuantas ordenes
fueron generadas en cada periodo del año 2005?

SELECT

DATENAME(MONTH,OrderDate) AS MES
,COUNT(*) AS NumeroOrdenes
,SUM(TOTALDUE) AS valorTotal
FROM [Sales].[SalesOrderHeader] AS S
WHERE YEAR(OrderDate)=2005
GROUP BY
DATENAME(MONTH,OrderDate),MONTH(OrderDate)
ORDER BY MONTH(OrderDate) asc
Consultas Agrupadas
Cuantas órdenes fueron enviadas por cada uno de los métodos de
transporte?
--suma ordernes por compañía
WITH Ordersbyshipper as(
select ShipMethodID, COUNT(ShipMethodID) as ordersbyshipper
from sales.SalesOrderHeader
Group by ShipMethodID)
--toma el nombre del metodo de transporte
select a.[Name],Ordersbyshipper.ordersbyshipper
from [Purchasing].[ShipMethod] a
inner join Ordersbyshipper
on a.[ShipMethodID]=Ordersbyshipper.[ShipMethodID]
Multiples Agrupaciones
Las sentencias GROUPING SETS, CUBE, ROLLUP permiten obtener múltiples
agrupaciones con una sola consulta. En las tres, se obtiene básicamente
sumatorias de nivel jerárquico superior es decir, subtotales por cada una de las
columnas de agrupación. GROUPING SETS es la más completa al permitir
especificar que tipo de subtotales deben ser calculados.
SELECT A.[ShipMethodID], YEAR(A.ShipDate) AS
shipyear
, COUNT(*) AS numorders
FROM sales.SalesOrderHeader A
where YEAR(ShipDate) is not null
GROUP BY GROUPING SETS (
( [ShipMethodID], YEAR(ShipDate) )
,( [ShipMethodID])
,( YEAR(ShipDate))
);
Pivot and Unpivot

1

2

3

1. Que quieres ver como filas
2. Que quieres ver como columnas,
3. Que información quieres ver en la intersección de ambas.
Pivot and Unpivot

SELECT

b.Name Territorio, C.City
, COUNT(*) AS numorders
FROM sales.SalesOrderHeader AS A
INNER JOIN SALES.SalesTerritory AS B
ON A.TerritoryID=b.TerritoryID
INNER JOIN [Person].[Address] AS C
ON A.ShipToAddressID=C.AddressID
INNER JOIN [Person].[StateProvince] AS D
ON C.StateProvinceID=D.StateProvinceID
WHERE b.Name='France'
GROUP BY b.Name, C.City;
Pivot and Unpivot

1
Territory

2
City

3
Quantity of orders by
City
Pivot and Unpivot

SELECT Territorio ,
[Paris],
[Les Ulis],
[Saint Ouen],
[Orleans],
[Colombes],
[Orly]
FROM (SELECT Territorio,City,numorders
FROM ventasEnFrancia
WHERE numorders>90) as SourceTable
PIVOT
(
SUM(numorders)
FOR City IN ([Paris],[Les Ulis],[Saint
Ouen],[Orleans],[Colombes],[Orly])
) AS pivotTable;
Pivot and Unpivot

Suponga que ahora, tiene
esta tabla y desea volver las
columnas a filas. A este
proceso se le conoce como
“unpivot”
Pivot and Unpivot
SELECT Territorio,
city,numorders FROM
(SELECT
territorio,[Paris],[Les
Ulis],[Saint
Ouen],[Orleans],[Colombes]
,[Orly]
FROM #unpivotexample) as
SourceTable
UNPIVOT
( numorders FOR CITY IN
([Paris],[Les Ulis],[Saint
Ouen],[Orleans],[Colombes]
,[Orly])
) AS UNPVT;
Lección 3: Funciones de agregación
Las funciones de agregación son las mismas vistas en la lección 1 (sum, count,
avg, min, max) excepto porque se usan bajo la clausula OVER.

“organice las ordenes bajo una secuencia numérica, agrupando la información
por transportadora, país destino y nombre de cliente”
SELECT b.ContactName,C.CompanyName,
A.ShipCountry,O.value
, SUM(O.value) OVER(PARTITION BY C.CompanyName,
A.ShipCountry) as value
, row_number() OVER(PARTITION BY C.CompanyName,
A.ShipCountry, b.ContactNamE ORDER BY b.ContactNamE,
O.value DESC) as value
FROM Orders a inner join [dbo].[Customers] b
on a.CustomerID=b.CustomerID
INNER JOIN Shippers C
ON A.ShipVia=C.ShipperID
INNER JOIN valueForOrder O
ON A.OrderID=O.OrderID
Funciones de agregación
La función RANK, ROW_NUMBER, DENSE_RANK, NTILE, permite agregar nuevas
columnas con secuenciales que pueden ser usados para tener un “consecutivo”
de cada fila, que puede depender de un partición.
SELECT A.CustomerID, A.SalesOrderNumber,ROUND(A.TotalDue,-3) AS VAL
, row_number() OVER(ORDER BY ROUND(A.TotalDue,-3) DESC) as rownum
, rank() OVER(ORDER BY ROUND(A.TotalDue,-3) DESC) as f_rank
, dense_rank() OVER(ORDER BY ROUND(A.TotalDue,-3) DESC) as f_denserank
, ntile(100) OVER(ORDER BY ROUND(A.TotalDue,-3) DESC) as f_tilegroup
FROM sales.SalesOrderHeader a

Agrupando datos en SQL Server

  • 1.
    Querying Microsoft SQL Server2012 Exam 70-461 Capítulo 5 – Grouping and Windowing Julián Castiblanco P. http://julycastiblanco.blogspot.com/ Julian_castiblancop@hotmail.com MCT-MCSA-MCITP-MCTS SQL Server 2008/2005 Líder ITPros-DC
  • 2.
    Material de trabajo WindowsServer 2012 trial http://www.microsoft.com/en-us/download/details.aspx?id=11093 SQL Server 2012 with SP1 trial http://www.microsoft.com/en-us/download/details.aspx?id=29066 AdventureWorks for SQL Server 2012 http://msftdbprodsamples.codeplex.com/releases/view/55330 Training kit SQL Server Querying Microsoft SQL Server 2012 – exam 70-461 http://www.amazon.com/Training-Kit-Exam-70-461Microsoft/dp/0735666059/ref=sr_1_1?ie=UTF8&qid=1359206206&sr=81&keywords=querying+microsoft+sql+server+2012+training+kit+exam+70-461
  • 3.
    Agenda • Consultas Agrupadas •Pivot and Unpivot • Función de agregación especiales
  • 4.
    Consultas Agrupadas Las consultasbásicas nos ayudan a responder preguntas de detalle, por ejemplo qué clientes realizaron compras el día de hoy? O cuales facturas han sido vendidas en el mes y por qué valor. Las agrupaciones dan un sentido más analítico a las consultas, responden preguntas como, cuantos clientes tengo? Cuanto dinero he ganado/perdido en el transcurso del año por producto?
  • 5.
  • 6.
    Consultas Agrupadas A cuantoasciende el valor de las ordenes y cuantas ordenes fueron generadas en cada periodo del año 2005? SELECT DATENAME(MONTH,OrderDate) AS MES ,COUNT(*) AS NumeroOrdenes ,SUM(TOTALDUE) AS valorTotal FROM [Sales].[SalesOrderHeader] AS S WHERE YEAR(OrderDate)=2005 GROUP BY DATENAME(MONTH,OrderDate),MONTH(OrderDate) ORDER BY MONTH(OrderDate) asc
  • 7.
    Consultas Agrupadas Cuantas órdenesfueron enviadas por cada uno de los métodos de transporte? --suma ordernes por compañía WITH Ordersbyshipper as( select ShipMethodID, COUNT(ShipMethodID) as ordersbyshipper from sales.SalesOrderHeader Group by ShipMethodID) --toma el nombre del metodo de transporte select a.[Name],Ordersbyshipper.ordersbyshipper from [Purchasing].[ShipMethod] a inner join Ordersbyshipper on a.[ShipMethodID]=Ordersbyshipper.[ShipMethodID]
  • 8.
    Multiples Agrupaciones Las sentenciasGROUPING SETS, CUBE, ROLLUP permiten obtener múltiples agrupaciones con una sola consulta. En las tres, se obtiene básicamente sumatorias de nivel jerárquico superior es decir, subtotales por cada una de las columnas de agrupación. GROUPING SETS es la más completa al permitir especificar que tipo de subtotales deben ser calculados. SELECT A.[ShipMethodID], YEAR(A.ShipDate) AS shipyear , COUNT(*) AS numorders FROM sales.SalesOrderHeader A where YEAR(ShipDate) is not null GROUP BY GROUPING SETS ( ( [ShipMethodID], YEAR(ShipDate) ) ,( [ShipMethodID]) ,( YEAR(ShipDate)) );
  • 9.
    Pivot and Unpivot 1 2 3 1.Que quieres ver como filas 2. Que quieres ver como columnas, 3. Que información quieres ver en la intersección de ambas.
  • 10.
    Pivot and Unpivot SELECT b.NameTerritorio, C.City , COUNT(*) AS numorders FROM sales.SalesOrderHeader AS A INNER JOIN SALES.SalesTerritory AS B ON A.TerritoryID=b.TerritoryID INNER JOIN [Person].[Address] AS C ON A.ShipToAddressID=C.AddressID INNER JOIN [Person].[StateProvince] AS D ON C.StateProvinceID=D.StateProvinceID WHERE b.Name='France' GROUP BY b.Name, C.City;
  • 11.
  • 12.
    Pivot and Unpivot SELECTTerritorio , [Paris], [Les Ulis], [Saint Ouen], [Orleans], [Colombes], [Orly] FROM (SELECT Territorio,City,numorders FROM ventasEnFrancia WHERE numorders>90) as SourceTable PIVOT ( SUM(numorders) FOR City IN ([Paris],[Les Ulis],[Saint Ouen],[Orleans],[Colombes],[Orly]) ) AS pivotTable;
  • 13.
    Pivot and Unpivot Supongaque ahora, tiene esta tabla y desea volver las columnas a filas. A este proceso se le conoce como “unpivot”
  • 14.
    Pivot and Unpivot SELECTTerritorio, city,numorders FROM (SELECT territorio,[Paris],[Les Ulis],[Saint Ouen],[Orleans],[Colombes] ,[Orly] FROM #unpivotexample) as SourceTable UNPIVOT ( numorders FOR CITY IN ([Paris],[Les Ulis],[Saint Ouen],[Orleans],[Colombes] ,[Orly]) ) AS UNPVT;
  • 15.
    Lección 3: Funcionesde agregación Las funciones de agregación son las mismas vistas en la lección 1 (sum, count, avg, min, max) excepto porque se usan bajo la clausula OVER. “organice las ordenes bajo una secuencia numérica, agrupando la información por transportadora, país destino y nombre de cliente” SELECT b.ContactName,C.CompanyName, A.ShipCountry,O.value , SUM(O.value) OVER(PARTITION BY C.CompanyName, A.ShipCountry) as value , row_number() OVER(PARTITION BY C.CompanyName, A.ShipCountry, b.ContactNamE ORDER BY b.ContactNamE, O.value DESC) as value FROM Orders a inner join [dbo].[Customers] b on a.CustomerID=b.CustomerID INNER JOIN Shippers C ON A.ShipVia=C.ShipperID INNER JOIN valueForOrder O ON A.OrderID=O.OrderID
  • 16.
    Funciones de agregación Lafunción RANK, ROW_NUMBER, DENSE_RANK, NTILE, permite agregar nuevas columnas con secuenciales que pueden ser usados para tener un “consecutivo” de cada fila, que puede depender de un partición. SELECT A.CustomerID, A.SalesOrderNumber,ROUND(A.TotalDue,-3) AS VAL , row_number() OVER(ORDER BY ROUND(A.TotalDue,-3) DESC) as rownum , rank() OVER(ORDER BY ROUND(A.TotalDue,-3) DESC) as f_rank , dense_rank() OVER(ORDER BY ROUND(A.TotalDue,-3) DESC) as f_denserank , ntile(100) OVER(ORDER BY ROUND(A.TotalDue,-3) DESC) as f_tilegroup FROM sales.SalesOrderHeader a