Pivotar en SQL 2000.

15/05/2007 - 18:08 por Salvador Ramos | Informe spam
Hola a todos,

Tengo una tabla con la siguiente estructura: Proveedor, RefProv, EAN,
Descripcion, Precio, PrecioNeto
En ella importo datos de las tarifas de diferentes proveedores. Tengo entre
1000 y 2000 filas por proveedor, y artículos cuyo código EAN coincide entre
diversos proveedores (a priori no sé cuantos). La PK de esta tabla es
Proveedor+RefProv

Lo que necesito es hacer una consulta que me devuelva: EAN, Descripcion,
"PrecioNeto de cada proveedor".
Por tanto necesito las dos primeras columnas más una por cada PrecioNeto, en
función de cuantos proveedores tengan ese código EAN. La verdad que no se me
ocurre como obtener ese número de columnas variable, y además tengo que
hacerlo para SQL Server 2000.

Pd. También me interesaría ver la solución con 2005 para compararla (pero
vamos esto es opcional).
Pd2. Siempre me queda la alternativa de montar un cubo muy sencillo sobre
esa tabla, pero me gustaría optar por una solución en el relacional :-)

Un saludo
Salvador Ramos

www.helpdna.net (información sobre SQL Server y Microsoft .Net)
www.helpdna.net/acerca_de_salvador_ramos.htm
 

Leer las respuestas

#1 Liliana Sorrentino
15/05/2007 - 20:45 | Informe spam
Hola Salvador,
Te paso una forma de resolverlo con SQL 2000, usando un SP que genera una
cantidad dinámica de columnas, no es mío, es de esas cosas que uno copia y
pega desde el foro.
No puedo decirte si es bueno el rendimiento porque las veces que lo necesité
fue para usarlo con menos de 10 millones de filas.
Espero que te sirva,
Liliana.

DROP Procedure #Proc_Query_Pivot_1
GO
CREATE Procedure #proc_Query_Pivot_1
@Datos_Base_SQL varchar(2000), -- SQL que devuelve datos para la
construcción de la tabla cruzada
@Encabe_Fila varchar(200), -- Lista de filas para usar como dato de
agrupamiento
@Encabe_Columna varchar(200), -- Nombre del dato que se usará como
encabezado de columna
@Titulo_Columna_SQL varchar(2000), -- SQL que devuelve los posibles
encabezados
@Operacion varchar(10), -- SUM, PRODUCT, etc
@Argumento varchar(200), -- Columna argumento de la operacion
@Totales char(1) -- 'S' incluye totales generales, 'N' los omite

AS

Declare @SQL varchar(2000),
@Summary_SQL varchar(2000) -- to summarize each row

Set @SQL = 'SELECT ' + @Encabe_Fila + ', '
Set @Summary_SQL = ''

CREATE TABLE #Col_Encabes
(Col_ID int identity(1,1),
Col_Encabe varchar(200) NULL)

Exec ('INSERT INTO #Col_Encabes (Col_Encabe) ' + @Titulo_Columna_SQL)

DECLARE @Col_ID_Curr int, -- columna chequeada
@Col_ID_Old int,
@Curr_Col_Encabe varchar(200),
@Pivot_SQL varchar(200) -- pivot SQL para la columna

SELECT TOP 1 @Col_ID_Curr = Col_ID, @Curr_Col_Encabe = Col_Encabe
FROM #Col_Encabes ORDER BY Col_ID

IF (@Col_ID_Curr IS NOT NULL )
BEGIN
Set @Col_ID_Old = @Col_ID_Curr - 1

WHILE (@Col_ID_Old <> @Col_ID_Curr)
BEGIN
Set @Pivot_SQL = char(13) + @Operacion
+ '(CASE ' + @Encabe_Columna
+ ' WHEN ''' + @Curr_Col_Encabe + ''' THEN ' + @Argumento
+ ' ELSE SPACE(2) END) AS [' + @Curr_Col_Encabe + ']'
Set @SQL = @SQL + ' ' + @Pivot_SQL

If (@Totales='S')
Set @Summary_SQL = @Summary_SQL + 'Pivot_Data.[' + @Curr_Col_Encabe + ']'

Set @Col_ID_Old = @Col_ID_Curr
SELECT TOP 1 @Col_ID_Curr = Col_ID, @Curr_Col_Encabe = Col_Encabe
FROM #Col_Encabes
WHERE Col_ID > @Col_ID_Curr
ORDER BY Col_ID

IF (@Col_ID_Old <> @Col_ID_Curr)
Begin
Set @SQL = @SQL + ', '
Set @Summary_SQL = @Summary_SQL + ' + '
End
END
END



DROP TABLE #Col_Encabes

Set @SQL = @SQL + char(13) + 'FROM (' + @Datos_Base_SQL + ') AS Datos_Base
'
+ char(13) + 'GROUP BY ' + @Encabe_Fila

If (@Totales='S')
Set @SQL = 'SELECT Pivot_Data.*, ' + char(13)
+ ' (' + @Summary_SQL + ') AS TOTAL ' + char(13)
+ 'FROM (' + @SQL + ') AS Pivot_Data'


Print @SQL
Select ''
Exec (@SQL)
go


EXEC #proc_Query_Pivot_1
micondicion"
'SELECT Proveedor, EAN, Descripcion, Precio
FROM #Prov',
'EAN',
'Proveedor',
'SELECT DISTINCT Proveedor FROM #Prov',
'MAX',
'Precio',
'n'




"Salvador Ramos" escribió en el
mensaje news:
Hola a todos,

Tengo una tabla con la siguiente estructura: Proveedor, RefProv, EAN,
Descripcion, Precio, PrecioNeto
En ella importo datos de las tarifas de diferentes proveedores. Tengo
entre 1000 y 2000 filas por proveedor, y artículos cuyo código EAN
coincide entre diversos proveedores (a priori no sé cuantos). La PK de
esta tabla es Proveedor+RefProv

Lo que necesito es hacer una consulta que me devuelva: EAN, Descripcion,
"PrecioNeto de cada proveedor".
Por tanto necesito las dos primeras columnas más una por cada PrecioNeto,
en función de cuantos proveedores tengan ese código EAN. La verdad que no
se me ocurre como obtener ese número de columnas variable, y además tengo
que hacerlo para SQL Server 2000.

Pd. También me interesaría ver la solución con 2005 para compararla (pero
vamos esto es opcional).
Pd2. Siempre me queda la alternativa de montar un cubo muy sencillo sobre
esa tabla, pero me gustaría optar por una solución en el relacional :-)

Un saludo
Salvador Ramos

www.helpdna.net (información sobre SQL Server y Microsoft .Net)
www.helpdna.net/acerca_de_salvador_ramos.htm



Preguntas similares