El power de PIVOT !!! - (SQL Server 2005)

Post cruzado de: blog en 3devnet.com

Se ha escuchando hablar bastante de la nueva sentencia PIVOT que viene con SQL Server 2005, ps bien, esta vez sólo quiero ejemplificar  acerca del tema. PIVOT es un sentencia que se usa para cruzar filas en columnas para mostrar resultados, la cual por cierto, toma un vison más estructurada, clara y agradable,... esta sentencia debe usarse para obtener resultados resumen más claros y descriptivos. Más información de esta sentencia pueden leerlo:  http://msdn2.microsoft.com/es-es/library/ms177410.aspx.

Ahora si, vamos con el ejemplo ilustrativo. Usaremos algunas tablas de la base de datos Northwind, como Orders, Orders Details, Employees, Products. El objetivo es listar el valor total vendido por cada empleado para los siguientes productos: 'Alice Mutton','Filo Mix','Flotemysost','Geitost', 'Konbu','Maxilaku','Pavlova','Tofu','Vegie-spread'. Muy bien, en SQL Server 2000 puede lograrse con este transact que programé como posible solución:

NOTA  vea el ejemplo que se ilustra en http://www.maestrosdelweb.com/editorial/sqlserver2000/ para analizar todo el código necesario para lograr un cruce de filas y columnas en SQL Server 2000, verás que no es nada divertido gastarse el tiempo en eso....;

SELECT Ventas1.*
FROM (SELECT Empleado, 
        (SELECT Products.ProductName FROM Products    
          WHERE Products.Productid=Ventas.ProductID) Producto, 
                SUM (ventas.ValorVendido)Total
      FROM (SELECT (C.lastname + ' ' + c.firstname)Empleado,ProductId,
                 (OD.Unitprice*OD.Quantity) [ValorVendido]
            FROM [Order Details] OD
             INNER JOIN ( [Orders] O        
              INNER JOIN Employees C
            ON O.Employeeid=C.Employeeid)
             ON OD.Orderid=O.OrderID) Ventas
GROUP BY Empleado, Productid) Ventas1
WHERE Producto IN('Alice Mutton','Filo Mix','Flotemysost','Geitost',
'Konbu','Maxilaku','Pavlova','Tofu','Vegie-spread')


Si te percataste en el código anterior, para lograr el objetivo hemos usado sentencias INNER JOINs y SUBQUERYs (3 subquerys), tomando el transact una forma no tan fácil de programar y que además no es el más óptimo. Como veremos a continuación, los resultados no son nada descriptivos y mucho peor organizados, como para presentárselos a tu jefe por ejemplo, ya me imagino que palabras te lanza cuando le presentes esa lista.. 

Podemos dar una mejor solución a este problema usando la sentencia PIVOT de SQL Server 2005, es decir, pivoteando el resultado anterior de la siguiente manera:

SELECT Empleado, [Alice Mutton],[Filo Mix],[Flotemysost],
      [Geitost],[Konbu], [Maxilaku],[Pavlova],[Tofu],[Vegie-spread]
FROM (SELECT Empleado, 
             (SELECT PRoducts.Productname FROM Products
             WHERE Products.Productid=Ventas.Productid) Producto,
                 SUM (ventas.ValorVendido) Total
      FROM (SELECT (C.lastname+ ' ' + C.firstname) Empleado, ProductID, 
               (OD.Unitprice*OD.Quantity) [ValorVendido]
            FROM [Order Details]OD
                INNER JOIN ([Orders] O
                INNER JOIN Employees C
             ON O.EmployeeID=C.EmployeeID
        )
ON OD.OrderID=O.OrderID) Ventas
--Where Empleado='Buchaman Steven' and ProductID='31'
GROUP BY Empleado,Productid) ventas1
PIVOT(SUM(total) FOR [Producto] IN ([Alice Mutton],[Filo Mix],[Flotemysost],
[Geitost],[Konbu],[Maxilaku],[Pavlova],[Tofu],[Vegie-spread])) AS pvt

Estos son los resultados, muy resumidos, organizados y bien claros para que tu jefe entienda perfectamente y tome las mejores decisiones, disminuyendo el costo de los procesos de negocio, y desde luego, siendo más productivo. Aquí los resultados...

Ahora comparando ambos resultados te darás cuenta que usar PIVOT con el mejor criterio para resumir y presentar los datos de su empresa, trae consigo beneficios, además de ser fácil de usar y muy práctico por cierto, quize decir, "una buena práctica.

Más información:

Ahora si me guardo (esperando haber contribuido a aclarar este tema).

Saludos,

Percy Reyes.

Published 6/2/2007 18:39 por Percy Reyes
Comparte este post:
http://geeks.ms/blogs/ozonicco/archive/2007/02/06/el-power-de-pivot-sql-server-2005.aspx

Comentarios

# re: El power de PIVOT !!! - (SQL Server 2005)

creo que es una estupidez el nuevo formato de SQL server 2005, que pasa si tienes que listar en los columnas de Pivote 20 columnas las tienes que listar todas?

ufffffff

Monday, July 23, 2007 9:23 PM por sfdfdf

# re: El power de PIVOT !!! - (SQL Server 2005)

me parece una funcion a medias porque implica que  uno debe saber de antemano que valores de los campos quiere utilizar. tiende a ser estatico y si uno quisiera hacer para muchas filas le tocaria escribirlas y no tiene ningun sentido de utilidad en la medida que no hay dinamismo.

Thursday, August 02, 2007 11:18 PM por Andres Rodriguez

# re: El power de PIVOT !!! - (SQL Server 2005)

Bastante malo tomando en consideració a Transform!!

Friday, August 03, 2007 4:51 AM por Ñoco

# re: El power de PIVOT !!! - (SQL Server 2005)

Un saludo,

me podria colaborar para usar el comando PIVOT , pero usando una sola tabla. es decir tengo una tabla  de la cual una columna llamada concepto , la debo mostrar en diferentes columnas de acuerdo a los diferentes concepto que tengo.

Me podrian enviar un ejemplo, no es necesario usar el INNER , ya que no hay mas tablas que cruzar

gracias de antemano por su colaboracion

gracias

Thursday, August 23, 2007 11:31 PM por diego

# re: El power de PIVOT !!! - (SQL Server 2005)

Hola Diego,

puedes decirme como quieres manipular los valores de "concepto"?, dame más detalles...

un saludo,

Friday, August 24, 2007 3:33 AM por Percy Reyes

# re: El power de PIVOT !!! - (SQL Server 2005)

Microsoft nos hubiera echo un enorme favor al dejar las cosas como estaban

Monday, September 17, 2007 6:56 PM por Walter

# re: El power de PIVOT !!! - (SQL Server 2005)

El mecanismo de construcción ha sido simplificado, pero es una camisa de fuerza su utilización, además, debes conocer lo que deberá listar las columnas para asi publicar los rotulos (aunque de forma más elaborada, mediante sub-query podemos obtener las cabeceras, y construir el query en cadena para ejecutarlo con EXEC())

Saludos

Wednesday, September 19, 2007 6:17 PM por Abel Arturo

# re: El power de PIVOT !!! - (SQL Server 2005)

ta que idiotas que son los que critican sin pensar.. piensen un poquito como se puede lograr la dinamisidad en esta funcion que con fines de ejemplo escribieron en duro los nombres de los productos... que no les dire como por pavos...

Tuesday, December 04, 2007 10:58 PM por Leo

# re: El power de PIVOT !!! - (SQL Server 2005)

Saludos, yo logre hacer el query de Pivot table dinamico y me simplifico la vida enormemente y funciono super bien lo invoco desde un SP y genero el resultado con un Exec dinámico.

Recuerden la mente es el limite de tu capacidad.

Tuesday, December 18, 2007 7:00 AM por Calfarob

# re: El power de PIVOT !!! - (SQL Server 2005)

La diferencia es que muchos compartimos algunas cosas:

<b><Implementación de PIVOT Dinámico</b>

geeks.ms/.../implementaci-243-n-de-pivot-din-225-mico.aspx

saludos a todos:).

Friday, December 28, 2007 5:31 PM por Percy Reyes

# Implementación de PIVOT Dinámico

PIVOT es uno de los nuevos operadores inclu&#237;dos en SQL Server 2005 que podemos usar en la cl&#225;usula

Friday, December 28, 2007 9:42 PM por Percy Reyes's SQLWebLog @ ComunidadesAndinas.com

# re: El power de PIVOT !!! - (SQL Server 2005)

Aquellos que tuvimos que hacer transpuestas de tablas con SQL 2000, formando SP de decenas de lineas, podemos apreciar la simplicidad de esta nueva característica

Friday, February 01, 2008 4:43 PM por Carlos

# re: El power de PIVOT !!! - (SQL Server 2005)

NO LO VEO DE MUCHA UTILIDAD...QUIZA LUEGO SAQUE UNA VERSION MEJORADA DE ESE SENTENCIA SQL...

Saturday, April 12, 2008 8:29 PM por var0n

# re: El power de PIVOT !!! - (SQL Server 2005)

no pues se me complico demasiado...

Friday, May 16, 2008 1:35 AM por zyklon2099

# re: El power de PIVOT !!! - (SQL Server 2005)

Buena opcion, todo posibilidad es buena, ya es aplicable segun las necesidades, creo que podria mejorar el rendimiento de la consulta, pero en si es utilidad que se utilizara por los que las necesitemos y como la necesitemos...

Tuesday, June 03, 2008 3:28 AM por Martin

# re: El power de PIVOT !!! - (SQL Server 2005)

Increible, se ve que cierta clase de desarrolladores les gusta trabajar demasiado haciendo sus consultitas.. Señores la sentencia Pivote, se utiliza mas que nada para mostrar resumenes de datos, es una funcion que es enormente mas rapida que hacer sub consultas.. me dan pena "desarrolladores de 5ta", antes de opinar estupideces. leaaaan tira de burros...

Tuesday, July 01, 2008 12:09 PM por Dba

# re: El power de PIVOT !!! - (SQL Server 2005)

Tengo una pregunta ,  SI bien puedo mover registros de un campo a columnas, podré realizarlo de alguna manera mover varios campos , mi caso es el siguiente, necesito mostrar datos de la siguiente manera

codigo Producto  anio   mes subperiodo   Cotizacion

1302                   2008     8          1                 50

1302                   2008     8          2                 60

1302                   2008     9          1                 50

1302                   2008     9          2                 55

1302                   2008     10        1                 45

1302                   2008     10        2                 50

1305                   2008     8          1                 30

1305                   2008     8          2                 10

1305                   2008     9          1                 11

1305                   2008     9          2                 50

1305                   2008     10        1                 20

1305                   2008     10        2                 50

Debo mostrarlo por Preiodos en las columnas asi:

1302                   50             60         50           55           45      50

1305                   30             10         11            50          20      50

ESpero pueda darme una solución a este mi problema, gracias!!!

Friday, October 24, 2008 6:05 PM por Sarita

# re: El power de PIVOT !!! - (SQL Server 2005)

Pues claro!! que se puede amigo... ahora como?? no tengo la menor idea, pero de que se puede, se puede, saludos y buena onda para todos, feliz navidad jo jo jo

Thursday, December 18, 2008 9:16 PM por Heston

# re: El power de PIVOT !!! - (SQL Server 2005)

MUY INTERESANTE LOS EJEMPLOS... T SERA RECOMPENSADO JEJEJEJ

Saturday, January 10, 2009 10:52 PM por HAD

# re: El power de PIVOT !!! - (SQL Server 2005)

Para consultas aplicadas cercana a analisis de negocios, es util la opcion pivot, para desarrollos simples no creo que la utilicen, pero cuando el producto requiere mostrar una herramienta de analisis es ahi donde entra su funcionalidad, quizas la tomen como inecesaria, entonces para que programan? para cubrir la necesidad o falicitar las operaciones de clientes, y como buenos desarrolladores hay que hacer y vender los productos, en este caso el software

Tuesday, March 24, 2009 11:21 PM por aherm

# mas ejemplos

nos podrian dar mas ejemplos de codigo de pivot en las bases de datos northwind asi como en adventureworks puesto que pivot se me hace interesante ya que comienso en esto de sql server 2005.

y una pregunta mas porque transform no lo reconoce mi sql server 2005 y lo toma como nombre de campo espero que me solucionen mi duda gracias

Thursday, March 26, 2009 7:29 PM por Ioseph

# re: El power de PIVOT !!! - (SQL Server 2005)

PIVOT SUCKSSS

Tuesday, October 06, 2009 12:48 AM por RAUL