Stupid table o Tabla temporal en SQL

SQL, mySQL, postgreSQL y otros motores
Responder
educarma
Novato
Mensajes: 29
Registrado: Dom Feb 06, 2011 11:37 pm
Contactar:

Stupid table o Tabla temporal en SQL

Mensaje por educarma » Mié Sep 21, 2011 6:51 pm

Tuve la necesidad de obtener un valor de un grupo de tablas, pero vi que sacarlo en un simple calculo era algo complejo, por lo que luego de investigar un poco me tope con la nunca bien ponderada STUPID TABLE, el asunto es asi:

Resulta que deseo obtener un valor de una OP (orden de produccion) y un lote, pero una consulta simple me reporta mas de un valor, como hacer?
Supongamos que tengo una tabla donde cada registro me indica que es una caja y dentro hay una hamburgesa, pero resulta que no todas las hamburgesas son iguales y pesan distinto, para poder determinar el tipo de hamburgesa tengo una relación a otra tabla donde me indica el tipo de hamburgesa y el peso. Cuando se produce una hamburgesa le vamos a indicar un número de OP y un lote, entonces mis tablas quedarian asi
diag1.PNG
suponiendo que quiero sacar cuantos gramos tengo de una OP y un LOTE, hacemos una consulta que quedaría mas o menos asi:

Código: Seleccionar todo

"SELECT     dbo.Cajas.Id_OP, dbo.Cajas.Id_Lote, COUNT(*) AS cajas, dbo.TipoHamb.Peso, COUNT(*) * dbo.TipoHamb.Peso AS gramos
FROM         dbo.Cajas INNER JOIN
                      dbo.TipoHamb ON dbo.Cajas.Id_TipoHamb = dbo.TipoHamb.Id_TipoHamb
GROUP BY dbo.Cajas.Id_OP, dbo.Cajas.Id_Lote, dbo.TipoHamb.Peso"
(nada del otro mundo..sin comentarios por favor)
El resultado seria asi:
diag2.PNG
Ups, todavia no obtengo lo que quiero, recordemos que yo solo quiero el total de gramos de una OP y un lote, por ahora lo tengo detallado por peso.
Para lograr lo que necesito vamos a utilizar la stupid table y vamos a hacer lo siguiente:

Código: Seleccionar todo

/* Verificamos que la tabla temporal no este creada..*/
IF EXISTS
(
SELECT *
FROM tempdb.dbo.sysobjects
WHERE ID = OBJECT_ID(N'tempdb..#TempTable')
)
BEGIN
/*Si está creada, la borramos.. */
DROP TABLE #TempTable
END
;
/* Hacemos la consulta pertinente, e insertamos en la temporal  */

SELECT     dbo.Cajas.Id_OP, dbo.Cajas.Id_Lote, COUNT(*) AS cajas, dbo.TipoHamb.Peso, COUNT(*) * dbo.TipoHamb.Peso AS Gramos
Into #TempTable
FROM         dbo.Cajas INNER JOIN
                      dbo.TipoHamb ON dbo.Cajas.Id_TipoHamb = dbo.TipoHamb.Id_TipoHamb
GROUP BY dbo.Cajas.Id_OP, dbo.Cajas.Id_Lote, dbo.TipoHamb.Peso

/* Calculamos el total de gramos para esa OP y Nro. de lote */

select id_op, id_lote, sum(gramos) as gramos from #TempTable
group by id_op, id_lote

y lo que vamos a obtener es lo suiguiente:
diag3.PNG
Todo esto lo podremos hacer desde un prop:sql y estaremos usando una stupid table en sql..
Es muy probable que ésto se pueda resolver de alguna otra manera y quizas mas eficientemente, aqui solo quise mostrar como manejar una tabla temporal de sql...
Con respecto al DROP de la tabla temporal, necesito borrarla, ya que si intento ejecutar la consulta nuevamente me va a dar error porque la tabla ya está definida, por eso es aconsjable verificar que la misma no exista.

Saludos y espero que les sea util.. un mero aprendiz..
No tiene los permisos requeridos para ver los archivos adjuntos a este mensaje.


oms647
Mensajes: 6
Registrado: Sab Feb 19, 2011 7:07 pm
Contactar:

Re: Stupid table o Tabla temporal en SQL

Mensaje por oms647 » Mié Sep 21, 2011 7:38 pm

Muchas gracias, ya que esto no lo sabia.

Oscar M.Schmidt

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 1 invitado