Upload
julian-castiblanco-p
View
757
Download
0
Tags:
Embed Size (px)
DESCRIPTION
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.
Citation preview
Julián Castiblanco P.http://julycastiblanco.blogspot.com/[email protected] SQL Server 2008/2005
Líder ITPros-DC
Querying Microsoft SQL Server 2012Exam 70-461Capítulo 5 – Grouping and Windowing
Material de trabajo
Windows Server 2012 trialhttp://www.microsoft.com/en-us/download/details.aspx?id=11093
SQL Server 2012 with SP1 trialhttp://www.microsoft.com/en-us/download/details.aspx?id=29066
AdventureWorks for SQL Server 2012http://msftdbprodsamples.codeplex.com/releases/view/55330
Training kit SQL Server Querying Microsoft SQL Server 2012 – exam 70-461http://www.amazon.com/Training-Kit-Exam-70-461-Microsoft/dp/0735666059/ref=sr_1_1?ie=UTF8&qid=1359206206&sr=8-1&keywords=querying+microsoft+sql+server+2012+training+kit+exam+70-461
• Consultas Agrupadas• Pivot and Unpivot• Función de agregación especiales
Agenda
Consultas Agrupadas
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?
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.
Consultas Agrupadas
Group by
Distinct
Having
Funciones
• Count()• Sum()• Average()• Max()• Min()
• stdev()• stdevp()• Grouping()• Grouping_id()• var()
http://technet.microsoft.com/en-us/library/ms173454.aspx
Consultas Agrupadas
SELECT DATENAME(MONTH,OrderDate) AS MES,COUNT(*) AS NumeroOrdenes,SUM(TOTALDUE) AS valorTotal
FROM [Sales].[SalesOrderHeader] AS SWHERE YEAR(OrderDate)=2005GROUP BY DATENAME(MONTH,OrderDate),MONTH(OrderDate) ORDER BY MONTH(OrderDate) asc
A cuanto asciende el valor de las ordenes y cuantas ordenes fueron generadas en cada periodo del año 2005?
Consultas Agrupadas
Cuantas órdenes fueron enviadas por cada uno de los métodos de transporte?
--suma ordernes por compañíaWITH Ordersbyshipper as(select ShipMethodID, COUNT(ShipMethodID) as ordersbyshipperfrom sales.SalesOrderHeaderGroup by ShipMethodID)--toma el nombre del metodo de transporteselect a.[Name],Ordersbyshipper.ordersbyshipperfrom [Purchasing].[ShipMethod] ainner 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 Awhere YEAR(ShipDate) is not null GROUP BY GROUPING SETS (( [ShipMethodID], YEAR(ShipDate) ),( [ShipMethodID]) ,( YEAR(ShipDate)));
Pivot and Unpivot
1. Que quieres ver como filas2. Que quieres ver como columnas,3. Que información quieres ver en la intersección de ambas.
321
Pivot and Unpivot
SELECT b.Name Territorio, C.City, COUNT(*) AS numorders
FROM sales.SalesOrderHeader AS AINNER JOIN SALES.SalesTerritory AS BON A.TerritoryID=b.TerritoryIDINNER JOIN [Person].[Address] AS CON A.ShipToAddressID=C.AddressIDINNER JOIN [Person].[StateProvince] AS DON C.StateProvinceID=D.StateProvinceIDWHERE b.Name='France'GROUP BY b.Name, C.City;
Pivot and Unpivot
321
Territory CityQuantity of orders by
City
Pivot and Unpivot
SELECT Territorio ,[Paris],[Les Ulis],[Saint Ouen],[Orleans],[Colombes],[Orly]FROM (SELECT Territorio,City,numorders
FROM ventasEnFranciaWHERE 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 SourceTableUNPIVOT( 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