Rendimiento de SubConsultas

02/11/2007 - 22:45 por Diego Romero | Informe spam
Hola
Como estan ?

Tengo una tabla donde esta toda la información del movimiento de artículos
de un inventario, asi:
Producto,Fecha,Tipo, Entrada, Salida,CostoEntradas,CostoSalidas
Ñ001,1/1/2007,ENT,100,0,1000000,0 (registro de entradas)
D1001,1/1/2007,SAL,0,10,0,100000 (registro de salidas)
D1001,2/2/2007,FCR,0,5,0,500000 (Registro de facturas)
D1001,2/2/2007,DFC,2,0,200000,0 (Registro de devolucion de facturas)

Necesito una consulta para ver el resumen de movimiento por producto, asi:
Producto,TotalEntradas,TotalSalidas,TotalCostoEntradas,TotalCostoSalidas,UnidadesVendidas,UnidadesDevolucionVentas

Cree una instrucción select utilizando un LEFT JOIN contra la misma tabla
para ver los totales de ventas:

SELECT T1.Producto,SUM(Entrada) as TotalEntradas,SUM( Salida) AS
TotalSalidas
,SUM(CostoEntradas) AS TotalCostoEntradas,SUM(CostoSalidas) AS
TotalCostoSalidas
,UnidadesVendidas,UnidadesDevolucionVentas
FROM Tabla1 AS T1 LEFT JOIN (SELECT Producto,SUM(Salida) AS
UnidadesVendidas,SUM(Entrada) AS UnidadesDevolucionVentas FROM Tabla1 WHERE
Tipo IN ('FCR','DFC')
GROUP BY Producto) AS T2 ON T1.Producto=T2.Producto
GROUP BY T1.Producto,UnidadesVendidas,UnidadesDevolucionVentas

Resultados:
D1001,102,15,1200000,600000,5,2

Debe mostrar todos los movimientos y adicionalmente los movimientos de
ventas solamente

La pregunta es:

Tiene más rendimiento este tipo de subconsultas, o crear una vista filtrando
las ventas ( WHERE Tipo IN ('FCR','DFC') )
y crear la instrucción SELECT uniendo la tabla con la vista ?

Espero me puedan dar una sugerencia.



Diego M Romero
 

Leer las respuestas

#1 jeastman
02/11/2007 - 23:18 | Informe spam
Hola diego.

Pueba lo siguiente:

select t.producto,
sum( t.entrada ) as totalEntradas,
sum( t.salida ) as totalSalidas,
sum( t.costoEntradas ) as totalCostosEntradas,
sum( t.costoSalidas ) as totalCostosSalidas,
sum( case t.tipo
when 'FCR' then t.salida
else 0
end ) as unidadesVendidas,
sum( case t.tipo
when 'DFC' then t.entrada
else 0
end ) as unidadesDevolucionVentas
from tabla1 t
group by t.producto

La idea es, que con el case filtres que necesitas sumar para un caso u otro.

Yo lo prefiero así para hacer un solo recorrido de la tabla y no el
doble recorrido en el caso del left join.

Otra cosa, en el caso de tu ejemplo, faltó tratar los posibles nulos que
te puede devolver un left join.

Cualquier duda estamos a la orden.

Espero que te sea de utilidad.

Saludos.


Diego Romero escribió:
Hola
Como estan ?

Tengo una tabla donde esta toda la información del movimiento de artículos
de un inventario, asi:
Producto,Fecha,Tipo, Entrada, Salida,CostoEntradas,CostoSalidas
=> D1001,1/1/2007,ENT,100,0,1000000,0 (registro de entradas)
D1001,1/1/2007,SAL,0,10,0,100000 (registro de salidas)
D1001,2/2/2007,FCR,0,5,0,500000 (Registro de facturas)
D1001,2/2/2007,DFC,2,0,200000,0 (Registro de devolucion de facturas)

Necesito una consulta para ver el resumen de movimiento por producto, asi:
Producto,TotalEntradas,TotalSalidas,TotalCostoEntradas,TotalCostoSalidas,UnidadesVendidas,UnidadesDevolucionVentas

Cree una instrucción select utilizando un LEFT JOIN contra la misma tabla
para ver los totales de ventas:

SELECT T1.Producto,SUM(Entrada) as TotalEntradas,SUM( Salida) AS
TotalSalidas
,SUM(CostoEntradas) AS TotalCostoEntradas,SUM(CostoSalidas) AS
TotalCostoSalidas
,UnidadesVendidas,UnidadesDevolucionVentas
FROM Tabla1 AS T1 LEFT JOIN (SELECT Producto,SUM(Salida) AS
UnidadesVendidas,SUM(Entrada) AS UnidadesDevolucionVentas FROM Tabla1 WHERE
Tipo IN ('FCR','DFC')
GROUP BY Producto) AS T2 ON T1.Producto=T2.Producto
GROUP BY T1.Producto,UnidadesVendidas,UnidadesDevolucionVentas

Resultados:
D1001,102,15,1200000,600000,5,2

Debe mostrar todos los movimientos y adicionalmente los movimientos de
ventas solamente

La pregunta es:

Tiene más rendimiento este tipo de subconsultas, o crear una vista filtrando
las ventas ( WHERE Tipo IN ('FCR','DFC') )
y crear la instrucción SELECT uniendo la tabla con la vista ?

Espero me puedan dar una sugerencia.



Diego M Romero


Preguntas similares