Clausula PIVOT.

01/11/2006 - 12:18 por Jose Antonio | Informe spam
Estoy intentando entender como funciona la clausula PIVOT en sql server
2005, y con los ejemplos que hay en los libros en pantalla no consigo
hacerlo, por ejemplo el sistema que utilizo en 2000 y que sigo utilizando en
2005 porque no se como hacerlo con PIVOT.

SELECT CLIENTE,

CASE WHEN ANO=@ANO1 THEN VENTAS ELSE 0 END AS VENTAS1,

CASE WHEN ANO=@ANO2 THEN VENTAS ELSE 0 END AS VENTAS2,

CASE WHEN ANO=@ANO3 THEN VENTAS ELSE 0 END AS VENTAS3,

CASE WHEN ANO=@ANO4 THEN VENTAS ELSE 0 END AS VENTAS4,

CASE WHEN ANO=@ANO5 THEN VENTAS ELSE 0 END AS VENTAS5,

CASE WHEN ANO=@ANO1 THEN DEPOSITO ELSE 0 END AS DEPOSITO1,

CASE WHEN ANO=@ANO2 THEN DEPOSITO ELSE 0 END AS DEPOSITO2,

CASE WHEN ANO=@ANO3 THEN DEPOSITO ELSE 0 END AS DEPOSITO3,

CASE WHEN ANO=@ANO4 THEN DEPOSITO ELSE 0 END AS DEPOSITO4,

CASE WHEN ANO=@ANO5 THEN DEPOSITO ELSE 0 END AS DEPOSITO5

FROM

(SELECT CLIENTE,ANO,SUM(VENTAS) AS VENTAS,SUM(DEPOSITO) AS DEPOSITO FROM
VT_FACTURASCLIENTE (NOEXPAND)

WHERE ANO>=@ANO1 AND ANO<=@ANO5 GROUP BY CLIENTE,ANO) A

¿Como seria esta sentencia con la calusula PIVOT?



Saludos.

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
01/11/2006 - 15:10 | Informe spam
Jose Antonio,

Creo que va a ser dificil dar con una sentencia que haga ese pivot. El
operador "pivot" de SQL Server 2005 no funciona con variables en la lista de
valores que se convertiran en los titulos de columnas. Por otra parte, estas
agregando dos columnas (ventas y depositos) y con este operador solo se
permite 1, al menos que hagas dos pivots y los unas mediante un join.

Para poder usar variables, tendremos que recurrir a sql dinamico. Aca te
paso un ejemplo sobre este tema, posteado por Javier Loria quien es un gran
colaborador de este grupo.

http://www.microsoft.com/communitie...sloc=en-us


AMB



"Jose Antonio" wrote:

Estoy intentando entender como funciona la clausula PIVOT en sql server
2005, y con los ejemplos que hay en los libros en pantalla no consigo
hacerlo, por ejemplo el sistema que utilizo en 2000 y que sigo utilizando en
2005 porque no se como hacerlo con PIVOT.

SELECT CLIENTE,

CASE WHEN ANO=@ANO1 THEN VENTAS ELSE 0 END AS VENTAS1,

CASE WHEN ANO=@ANO2 THEN VENTAS ELSE 0 END AS VENTAS2,

CASE WHEN ANO=@ANO3 THEN VENTAS ELSE 0 END AS VENTAS3,

CASE WHEN ANO=@ANO4 THEN VENTAS ELSE 0 END AS VENTAS4,

CASE WHEN ANO=@ANO5 THEN VENTAS ELSE 0 END AS VENTAS5,

CASE WHEN ANO=@ANO1 THEN DEPOSITO ELSE 0 END AS DEPOSITO1,

CASE WHEN ANO=@ANO2 THEN DEPOSITO ELSE 0 END AS DEPOSITO2,

CASE WHEN ANO=@ANO3 THEN DEPOSITO ELSE 0 END AS DEPOSITO3,

CASE WHEN ANO=@ANO4 THEN DEPOSITO ELSE 0 END AS DEPOSITO4,

CASE WHEN ANO=@ANO5 THEN DEPOSITO ELSE 0 END AS DEPOSITO5

FROM

(SELECT CLIENTE,ANO,SUM(VENTAS) AS VENTAS,SUM(DEPOSITO) AS DEPOSITO FROM
VT_FACTURASCLIENTE (NOEXPAND)

WHERE ANO>=@ANO1 AND ANO<=@ANO5 GROUP BY CLIENTE,ANO) A

¿Como seria esta sentencia con la calusula PIVOT?



Saludos.



Respuesta Responder a este mensaje
#2 Jose Antonio
01/11/2006 - 20:21 | Informe spam
Gracias Alejandro.

"Alejandro Mesa" escribió en el
mensaje news:
Jose Antonio,

Creo que va a ser dificil dar con una sentencia que haga ese pivot. El
operador "pivot" de SQL Server 2005 no funciona con variables en la lista
de
valores que se convertiran en los titulos de columnas. Por otra parte,
estas
agregando dos columnas (ventas y depositos) y con este operador solo se
permite 1, al menos que hagas dos pivots y los unas mediante un join.

Para poder usar variables, tendremos que recurrir a sql dinamico. Aca te
paso un ejemplo sobre este tema, posteado por Javier Loria quien es un
gran
colaborador de este grupo.

http://www.microsoft.com/communitie...sloc=en-us


AMB



"Jose Antonio" wrote:

Estoy intentando entender como funciona la clausula PIVOT en sql server
2005, y con los ejemplos que hay en los libros en pantalla no consigo
hacerlo, por ejemplo el sistema que utilizo en 2000 y que sigo utilizando
en
2005 porque no se como hacerlo con PIVOT.

SELECT CLIENTE,

CASE WHEN ANO=@ANO1 THEN VENTAS ELSE 0 END AS VENTAS1,

CASE WHEN ANO=@ANO2 THEN VENTAS ELSE 0 END AS VENTAS2,

CASE WHEN ANO=@ANO3 THEN VENTAS ELSE 0 END AS VENTAS3,

CASE WHEN ANO=@ANO4 THEN VENTAS ELSE 0 END AS VENTAS4,

CASE WHEN ANO=@ANO5 THEN VENTAS ELSE 0 END AS VENTAS5,

CASE WHEN ANO=@ANO1 THEN DEPOSITO ELSE 0 END AS DEPOSITO1,

CASE WHEN ANO=@ANO2 THEN DEPOSITO ELSE 0 END AS DEPOSITO2,

CASE WHEN ANO=@ANO3 THEN DEPOSITO ELSE 0 END AS DEPOSITO3,

CASE WHEN ANO=@ANO4 THEN DEPOSITO ELSE 0 END AS DEPOSITO4,

CASE WHEN ANO=@ANO5 THEN DEPOSITO ELSE 0 END AS DEPOSITO5

FROM

(SELECT CLIENTE,ANO,SUM(VENTAS) AS VENTAS,SUM(DEPOSITO) AS DEPOSITO FROM
VT_FACTURASCLIENTE (NOEXPAND)

WHERE ANO>=@ANO1 AND ANO<=@ANO5 GROUP BY CLIENTE,ANO) A

¿Como seria esta sentencia con la calusula PIVOT?



Saludos.



Respuesta Responder a este mensaje
#3 Jose Antonio
01/11/2006 - 20:27 | Informe spam
He visto el ejemplo y las opciones de utilizar pivot, con lo cual he llegado
a la conclusion que esta clausula solo sirve para columnas fijas, es decir
en un programa de verdad no sirve para nada, porque nunca se consultara
siempre por los mismos datos.

"Alejandro Mesa" escribió en el
mensaje news:
Jose Antonio,

Creo que va a ser dificil dar con una sentencia que haga ese pivot. El
operador "pivot" de SQL Server 2005 no funciona con variables en la lista
de
valores que se convertiran en los titulos de columnas. Por otra parte,
estas
agregando dos columnas (ventas y depositos) y con este operador solo se
permite 1, al menos que hagas dos pivots y los unas mediante un join.

Para poder usar variables, tendremos que recurrir a sql dinamico. Aca te
paso un ejemplo sobre este tema, posteado por Javier Loria quien es un
gran
colaborador de este grupo.

http://www.microsoft.com/communitie...sloc=en-us


AMB



"Jose Antonio" wrote:

Estoy intentando entender como funciona la clausula PIVOT en sql server
2005, y con los ejemplos que hay en los libros en pantalla no consigo
hacerlo, por ejemplo el sistema que utilizo en 2000 y que sigo utilizando
en
2005 porque no se como hacerlo con PIVOT.

SELECT CLIENTE,

CASE WHEN ANO=@ANO1 THEN VENTAS ELSE 0 END AS VENTAS1,

CASE WHEN ANO=@ANO2 THEN VENTAS ELSE 0 END AS VENTAS2,

CASE WHEN ANO=@ANO3 THEN VENTAS ELSE 0 END AS VENTAS3,

CASE WHEN ANO=@ANO4 THEN VENTAS ELSE 0 END AS VENTAS4,

CASE WHEN ANO=@ANO5 THEN VENTAS ELSE 0 END AS VENTAS5,

CASE WHEN ANO=@ANO1 THEN DEPOSITO ELSE 0 END AS DEPOSITO1,

CASE WHEN ANO=@ANO2 THEN DEPOSITO ELSE 0 END AS DEPOSITO2,

CASE WHEN ANO=@ANO3 THEN DEPOSITO ELSE 0 END AS DEPOSITO3,

CASE WHEN ANO=@ANO4 THEN DEPOSITO ELSE 0 END AS DEPOSITO4,

CASE WHEN ANO=@ANO5 THEN DEPOSITO ELSE 0 END AS DEPOSITO5

FROM

(SELECT CLIENTE,ANO,SUM(VENTAS) AS VENTAS,SUM(DEPOSITO) AS DEPOSITO FROM
VT_FACTURASCLIENTE (NOEXPAND)

WHERE ANO>=@ANO1 AND ANO<=@ANO5 GROUP BY CLIENTE,ANO) A

¿Como seria esta sentencia con la calusula PIVOT?



Saludos.



Respuesta Responder a este mensaje
#4 Javier Loria
01/11/2006 - 22:33 | Informe spam
Hola Jose Antonio:
Si quieres generar las columnas de forma dinamica se puede hacer
construyendo la consulta de forma dinamica en el cliente o usando SQL
Dinamico.
Puedes revisar http://www.hayes.ch/sql/sql_dinamico.html sobre el SQL
Dinamico.
Si siempre lo quieres hacer, este es un ejemplo que escribi en este foro
recientemente:
ÞCLARE @Columna NVARCHAR(MAX);
DECLARE @Sentencia NVARCHAR(MAX);
SET @SeNtencia='SELECT *
from
(
SELECT Periodos.Periodo
, Movimientos.Articulo
, Movimientos.Importe
FROM dbo.ListaPeriodos(''SEMANA'', ' +
CONVERT(VARCHAR(8), @FDesde, 112) + ', '
+CONVERT(VARCHAR(8), @FHasta, 112)+ ')
AS Periodos
INNER JOIN Movimientos
ON Movimientos.Fecha >= Periodos.FechaDesde
AND Movimientos.Fecha <= Periodos.FechaHasta) p
PIVOT(SUM(Importe) for titulo in (';

WITH Fechas(Fecha)
AS
( SELECT CAST(@FDesde AS SMALLDATETIME)
UNION ALL
SELECT DATEADD(DAY, 1, Fecha)
FROM Fechas
WHERE Fecha<@FHasta
)
SELECT @Columna=COALESCE(@Columna+ ', ['+
CONVERT(VARCHAR(8), Fecha, 112)+']','['+CONVERT(VARCHAR(8), Fecha,
112)+']')
FROM Fechas;
SET @Sentencia=@Sentencia+@Columna+')) as pvt';


execute sp_executesql @Sentencia
==
Saludos,



Javier Loria
Costa Rica-MVP
Solid Quality Learning



"Jose Antonio" wrote in message
news:O6myQve$
He visto el ejemplo y las opciones de utilizar pivot, con lo cual he
llegado a la conclusion que esta clausula solo sirve para columnas fijas,
es decir en un programa de verdad no sirve para nada, porque nunca se
consultara siempre por los mismos datos.

"Alejandro Mesa" escribió en el
mensaje news:
Jose Antonio,

Creo que va a ser dificil dar con una sentencia que haga ese pivot. El
operador "pivot" de SQL Server 2005 no funciona con variables en la lista
de
valores que se convertiran en los titulos de columnas. Por otra parte,
estas
agregando dos columnas (ventas y depositos) y con este operador solo se
permite 1, al menos que hagas dos pivots y los unas mediante un join.

Para poder usar variables, tendremos que recurrir a sql dinamico. Aca te
paso un ejemplo sobre este tema, posteado por Javier Loria quien es un
gran
colaborador de este grupo.

http://www.microsoft.com/communitie...sloc=en-us


AMB



"Jose Antonio" wrote:

Estoy intentando entender como funciona la clausula PIVOT en sql server
2005, y con los ejemplos que hay en los libros en pantalla no consigo
hacerlo, por ejemplo el sistema que utilizo en 2000 y que sigo
utilizando en
2005 porque no se como hacerlo con PIVOT.

SELECT CLIENTE,

CASE WHEN ANO=@ANO1 THEN VENTAS ELSE 0 END AS VENTAS1,

CASE WHEN ANO=@ANO2 THEN VENTAS ELSE 0 END AS VENTAS2,

CASE WHEN ANO=@ANO3 THEN VENTAS ELSE 0 END AS VENTAS3,

CASE WHEN ANO=@ANO4 THEN VENTAS ELSE 0 END AS VENTAS4,

CASE WHEN ANO=@ANO5 THEN VENTAS ELSE 0 END AS VENTAS5,

CASE WHEN ANO=@ANO1 THEN DEPOSITO ELSE 0 END AS DEPOSITO1,

CASE WHEN ANO=@ANO2 THEN DEPOSITO ELSE 0 END AS DEPOSITO2,

CASE WHEN ANO=@ANO3 THEN DEPOSITO ELSE 0 END AS DEPOSITO3,

CASE WHEN ANO=@ANO4 THEN DEPOSITO ELSE 0 END AS DEPOSITO4,

CASE WHEN ANO=@ANO5 THEN DEPOSITO ELSE 0 END AS DEPOSITO5

FROM

(SELECT CLIENTE,ANO,SUM(VENTAS) AS VENTAS,SUM(DEPOSITO) AS DEPOSITO FROM
VT_FACTURASCLIENTE (NOEXPAND)

WHERE ANO>=@ANO1 AND ANO<=@ANO5 GROUP BY CLIENTE,ANO) A

¿Como seria esta sentencia con la calusula PIVOT?



Saludos.









email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida