Ayuda Pivot

23/10/2006 - 17:35 por Paco | Informe spam
Hola

Necesito hacer una consulta con PIVOT creando las columnas de forma dinámica.
Os explico un poco lo que he hecho para que podais entender mejor el objetivo.

Tengo una tabla de movimientos de este tipo:

Fecha (k)
Producto (k)
Importe

Tengo otra tabla con los periodos a consultar :

Periodo (k)
FechaDesde
FechaHasta

Esta tabla se devuelve de una función y el tipo de periodo puede ser
dias,semanas,mes,año,decena,quincena,trimestre, etc...

Para hacer pivot he probado con este ejemplo:

SELECT Articulo, [15/2006], [16/2006] from
(
SELECT Periodos.Periodo, Movimientos.Articulo, Movimientos.Importe
FROM dbo.ListaPeriodos('SEMANA', @FDesde, @FHasta) AS Periodos
INNER JOIN
Movimientos ON Movimientos.Fecha >=
Periodos.FechaDesde AND
Movimientos.Fecha <= Periodos.FechaHasta
) p
pivot
(
sum(Importe) for titulo in ([15/2006],[16/2006]))
as pvt

Con esto consigo el siguiente resultado :

Articulo [15/2006] [16/2006]
1 125 250
2 135 365
3 0 52
4 50 26

He conseguido acercarme al objetivo pero siempre conociendo los valores de
las columnas de periodos.
Lo que me gustaría hacer es la misma consulta pero pudiendo cambiar los
periodos de forma dinámica, sin escribirlos en la sentencia PIVOT.

Si alguien se le ocurre como...
 

Leer las respuestas

#1 Javier Loria
23/10/2006 - 18:27 | Informe spam
Hola:
No existe forma de hacer esto, sin usar SQL Dinamico. Puedes revisar
http://www.hayes.ch/sql/sql_dinamico.html.
En todo caso si lo necesitas seria un codigo horrible, algo como:
Þ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

"Paco" wrote in message
news:
Hola

Necesito hacer una consulta con PIVOT creando las columnas de forma
dinámica.
Os explico un poco lo que he hecho para que podais entender mejor el
objetivo.

Tengo una tabla de movimientos de este tipo:

Fecha (k)
Producto (k)
Importe

Tengo otra tabla con los periodos a consultar :

Periodo (k)
FechaDesde
FechaHasta

Esta tabla se devuelve de una función y el tipo de periodo puede ser
dias,semanas,mes,año,decena,quincena,trimestre, etc...

Para hacer pivot he probado con este ejemplo:

SELECT Articulo, [15/2006], [16/2006] from
(
SELECT Periodos.Periodo, Movimientos.Articulo, Movimientos.Importe
FROM dbo.ListaPeriodos('SEMANA', @FDesde, @FHasta) AS Periodos
INNER JOIN
Movimientos ON Movimientos.Fecha >> Periodos.FechaDesde AND
Movimientos.Fecha <= Periodos.FechaHasta
) p
pivot
(
sum(Importe) for titulo in ([15/2006],[16/2006]))
as pvt

Con esto consigo el siguiente resultado :

Articulo [15/2006] [16/2006]
1 125 250
2 135 365
3 0 52
4 50 26

He conseguido acercarme al objetivo pero siempre conociendo los valores de
las columnas de periodos.
Lo que me gustaría hacer es la misma consulta pero pudiendo cambiar los
periodos de forma dinámica, sin escribirlos en la sentencia PIVOT.

Si alguien se le ocurre como...

Preguntas similares