post icon

Pasar filas a columnas con Pivot en SQL Server

Hace tiempo ya que tenía pendiente escribir sobre la función para crear Pivots en SQL Server, y que sirve en otros motores que también comparten la sintaxis.

El plan es desarrollar varios temas que tienen que ver con el Pivot, Unpivot, estáticos y dinámicos, pero en esta primer entrega veremos el Pivot estático.

Lo que hace el pivot es agrupar los datos que están en filas y los pasa a columnas, y para ello debemos conocer los posibles resultados que pueden retornar estas filas.

Imaginemos que tenemos sucursales de una empresa que generan ventas, y queremos ver de todas las sucursales por cuanto han vendido mensualmente, una consulta típica sería así

SELECT
	S.NOMBRE 'SUCURSAL',
	V.MES,
	SUM(VD.MONTO) 'MONTO'
FROM
	VENTAS V
JOIN VENTASDETALLE VD ON V.IDVENTA = VD.IDVENTA
JOIN SUCURSAL S ON V.IDSUCURSAL = S.IDSUCURSAL
GROUP BY
	S.NOMBRE,
	V.MES
ORDER BY
	S.NOMBRE,
	V.MES,
	SUM(VD.MONTO)

Con esto podriamos tener un resultado como este

MATRIZ | ENERO | 50.004.340
MATRIZ | FEBRERO | 80.568.157
MATRIZ | MARZO | 83.148.001
LISBOA | ENERO | 35.568.457
LISBOA | FEBRERO | 7.983.160
LISBOA | MARZO | 3.697.198
LONDRES | ENERO | 45.119.015
LONDRES | FEBRERO | 424.161.068
LONDRES | MARZO | 35.694.149

Pero si lo que desamos es visualizar los datos de esta manera

SUCURSAL 	| ENERO 		| 	FEBRERO 		| 	MARZO		|
----------------------------------------------------------------
MATRIZ 		| 50.004.340	|	80.568.157		|	83.148.001	|
LISBOA		| 35.568.457	|	7.983.160		|	3.697.198	|
LONDRES 	| 45.119.015	|	424.161.068		|	35.694.149	|

Hacemos uso del Pivot y generamos la estructura de datos

SELECT
	SUCURSAL,
	MES,
	COALESCE(ENERO, 0) ENERO,
	COALESCE(FEBRERO, 0) FEBRERO,
	COALESCE(MARZO, 0) MARZO
FROM
	(
		SELECT
			S.NOMBRE 'SUCURSAL',
			V.MES,
			VD.MONTO
		FROM
			VENTAS V
		JOIN VENTASDETALLE VD ON V.IDVENTA = VD.IDVENTA
		JOIN SUCURSAL S ON V.IDSUCURSAL= S.IDSUCURSAL
	) SOURCE
PIVOT
	(
		SUM(SOURCE.MONTO) FOR SOURCE.MES IN (ENERO, FEBRERO, MARZO)
	) AS PIVOTABLE;

Comentarios desde Facebook:

  1. avatar
    casa PERU Google Chrome Windows
    29 noviembre 2016 at 11:52 #

    csas

  2. avatar
    casa PERU Google Chrome Windows
    29 noviembre 2016 at 11:50 #
  3. avatar
    casa PERU Google Chrome Windows
    29 noviembre 2016 at 11:50 #

    “alert(“a, Carlos”);”

  4. avatar
    casa PERU Google Chrome Windows
    29 noviembre 2016 at 11:46 #

    alert(“Bienvenido, Carlos”);

  5. avatar
    Andres00 COLOMBIA Mozilla Firefox Windows
    2 octubre 2014 at 11:21 #

    y la parte dinamica?

  6. avatar
    Abrilo Internet Explorer Windows
    29 octubre 2013 at 12:16 #

    Suponiendo que trae info de Enero a Diciembre. Pero si quisiera que solamente me retornara información de Enero a Mayo. Cómo sería ?

  7. avatar
    Guille04 PARAGUAY Google Chrome Windows
    14 junio 2013 at 13:03 #

    SELECT
    S.NOMBRE ‘SUCURSAL’,
    V.MES,
    SUM(VD.MONTO) ‘MONTO’
    FROM
    VENTAS V
    JOIN VENTASDETALLE VD ON V.IDVENTA = VD.IDVENTA
    JOIN SUCURSAL S ON V.IDVENTA = S.IDSUCURSAL
    GROUP BY
    S.NOMBRE,
    V.MES
    ORDER BY
    S.NOMBRE,
    V.MES,
    SUM(VD.MONTO)
    Esa parte de marcada no entiendo.

    • avatar
      GeekZero PARAGUAY Google Chrome Windows
      14 junio 2013 at 14:01 #

      Corregido Guille

      • avatar
        Guille04 PARAGUAY Google Chrome Windows
        14 junio 2013 at 14:36 #

        Gracias por el aporte 😉

Responder