Ayuda con Tablas Temporales

20/07/2004 - 22:52 por Gustavo Venturo Rivera | Informe spam
Amigos recurro a Uds.
Tengo las siguientes tablas (resumidas para efectos de abreviar)
Tabla Obra (idObra NVARCHAR(8))
Datos Ejmp: DCH, HC, VEL2, CRR

Tabla EncGuia (idGuia INT, idObra NVARCHAR(8))
DATOS Ejmp: (1, DCH); (2,HC);(3,DCH);(4,HC), ETC..

Tabla tblDetalleGuia (idGuia, idMaterial, Marca NVARCHAR(50), Modelo
NVARCHAR(50),
Cantidad MONEY)
Datos Ejmp: (1,1,"PHILLIPS","MK50",10) ; (1,2,NULL,NULL,2.75)
;(2,1,"PHILLIPS","MK50",5); (2,50,NULL,NULL,4.5);(3,50,NULL,NULL,2.75)

Necesito Crear la siguiente tabla
IdMaterial Marca Modelo CRR DCH HC VEL2 (Nombres de columna, el de la
obras)
1 PHILLIPS MK50 5 10 0 0
2 NULL NULL 0 2.75 0 0
.

El tema lo he resuelto creando una tabla Access, de la que por código
determino los nombre de columnas correspondientes a cada obra, y la cantidad
de la misma, sin embargo es un proceso de paso de información resulta muy
lento, pensaba en crear una tabla temporal, pero leyendo en el BOL, ví que
una vez terminada la ejecución del SP, donde crearía la tabla, esta
"desaparecería" (entendí bien???), se les ocurre otra alternativa que no sea
OLAP que también la pense pero no dispongo (lamentablemente) del tiempo para
capacitarme en ello.

Gracias
Gustavo
 

Leer las respuestas

#1 Liliana Sorrentino
21/07/2004 - 14:00 | Informe spam
Hola Gustavo,

Para obtener ese resultado en SQL, deberás usar un Cross Table Dinámico o
Variable, por ahora SQL no tiene otra opción como en Access. Si ese
resultado debe quedar en una tabla temporal o no, depende de lo que harás
con ella y en qué momento. Como leíste, una tabla temporal local dura lo que
dura la sesión, en los BOL está bien explicado.

Te envío el SP para generar ese resultado, si lo querés en una tabla solo
tendrías que agregarle un Insert.
Saludos... Liliana.


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 0 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 IdMaterial, Marca, Modelo, #Obra.IdObra, Cantidad
FROM #Obra
INNER JOIN #EncGuia ON #Obra.IdObra = #EncGuia.IdObra
INNER JOIN #tblDetalleGuia ON #EncGuia.IdGuia = #tblDetalleGuia.IdGuia
',
'IdMaterial, Marca, Modelo',
'IdObra',
'SELECT IdObra FROM #Obra',
'SUM',
'cantidad',
'n'




"Gustavo Venturo Rivera" <gventuro@ quita esto vain-arm.cl> escribió en el
mensaje news:
Amigos recurro a Uds.
Tengo las siguientes tablas (resumidas para efectos de abreviar)
Tabla Obra (idObra NVARCHAR(8))
Datos Ejmp: DCH, HC, VEL2, CRR

Tabla EncGuia (idGuia INT, idObra NVARCHAR(8))
DATOS Ejmp: (1, DCH); (2,HC);(3,DCH);(4,HC), ETC..

Tabla tblDetalleGuia (idGuia, idMaterial, Marca NVARCHAR(50), Modelo
NVARCHAR(50),
Cantidad MONEY)
Datos Ejmp: (1,1,"PHILLIPS","MK50",10) ; (1,2,NULL,NULL,2.75)
;(2,1,"PHILLIPS","MK50",5); (2,50,NULL,NULL,4.5);(3,50,NULL,NULL,2.75)

Necesito Crear la siguiente tabla
IdMaterial Marca Modelo CRR DCH HC VEL2 (Nombres de columna, el de la
obras)
1 PHILLIPS MK50 5 10 0 0
2 NULL NULL 0 2.75 0 0
.

El tema lo he resuelto creando una tabla Access, de la que por código
determino los nombre de columnas correspondientes a cada obra, y la


cantidad
de la misma, sin embargo es un proceso de paso de información resulta muy
lento, pensaba en crear una tabla temporal, pero leyendo en el BOL, ví que
una vez terminada la ejecución del SP, donde crearía la tabla, esta
"desaparecería" (entendí bien???), se les ocurre otra alternativa que no


sea
OLAP que también la pense pero no dispongo (lamentablemente) del tiempo


para
capacitarme en ello.

Gracias
Gustavo


Preguntas similares