agrupando datos en sql server

16
Julián Castiblanco P. http:// julycastiblanco.blogspot.com/ [email protected] MCT-MCSA-MCITP-MCTS SQL Server 2008/2005 Líder ITPros-DC Querying Microsoft SQL Server 2012 Exam 70-461 Capítulo 5 – Grouping and Windowing

Upload: julian-castiblanco-p

Post on 26-May-2015

757 views

Category:

Technology


0 download

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.

TRANSCRIPT

Page 1: Agrupando datos en SQL Server

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

Page 2: Agrupando datos en SQL Server

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

Page 3: Agrupando datos en SQL Server

• Consultas Agrupadas• Pivot and Unpivot• Función de agregación especiales

Agenda

Page 4: Agrupando datos en SQL Server

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.

Page 5: Agrupando datos en SQL Server

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

Page 6: Agrupando datos en SQL Server

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?

Page 7: Agrupando datos en SQL Server

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]

Page 8: Agrupando datos en SQL Server

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)));

Page 9: Agrupando datos en SQL Server

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

Page 10: Agrupando datos en SQL Server

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;

Page 11: Agrupando datos en SQL Server

Pivot and Unpivot

321

Territory CityQuantity of orders by

City

Page 12: Agrupando datos en SQL Server

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;

Page 13: Agrupando datos en SQL Server

Pivot and Unpivot

Suponga que ahora, tiene esta tabla y desea volver las columnas a filas. A este proceso se le conoce como “unpivot”

Page 14: Agrupando datos en SQL Server

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;

Page 15: Agrupando datos en SQL Server

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

Page 16: Agrupando datos en SQL Server

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