en esta presentación encontrará la teoría básica de las funciones disponibles en SQL Server 2012 para agrupar información, también funciones avanzadas como pivot y anpivot tables.
1. 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
2. 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
4. 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?
6. 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
7. 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]
8. 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))
);
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.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;
12. 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;
13. Pivot and Unpivot
Suponga que ahora, tiene
esta tabla y desea volver las
columnas a filas. A este
proceso se le conoce como
“unpivot”
14. 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;
15. 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
16. 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