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

Preguntas similare

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


Respuesta Responder a este mensaje
#2 Diego Romero
02/11/2007 - 23:36 | Informe spam
Muchas gracias ! Funcionó bien.

Lo único es que los tipos de documento de ventas (facturas , devoluciones)
son como 20 : FCR, FC1,FC2,,FC9
, bueno tendré que aumentar las líneas when ... then ...



Diego M Romero

"jeastman" escribió en el mensaje
news:%
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
Respuesta Responder a este mensaje
#3 jeastman
03/11/2007 - 00:05 | Informe spam
Hola Diego.

No es necesario, puedes hacer algo así en el case


sum( case
when t.tipo like 'FC%' then t.salida
else 0
end ) as unidadesVendidas,


Sino te comprendí mal, ésto debería funcinar

Saludos.


Diego Romero escribió:
Muchas gracias ! Funcionó bien.

Lo único es que los tipos de documento de ventas (facturas , devoluciones)
son como 20 : FCR, FC1,FC2,,FC9
, bueno tendré que aumentar las líneas when ... then ...



Diego M Romero

"jeastman" escribió en el mensaje
news:%
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






Respuesta Responder a este mensaje
#4 Diego Romero
03/11/2007 - 15:12 | Informe spam
Si, estuve buscando en BOL y tambien se puede utilizar de esta forma.

Me ayudo mucho, gracias


Diego M Romero

"jeastman" escribió en el mensaje
news:%
Hola Diego.

No es necesario, puedes hacer algo así en el case


sum( case
when t.tipo like 'FC%' then t.salida
else 0
end ) as unidadesVendidas,


Sino te comprendí mal, ésto debería funcinar

Saludos.


Diego Romero escribió:
Muchas gracias ! Funcionó bien.

Lo único es que los tipos de documento de ventas (facturas ,
devoluciones) son como 20 : FCR, FC1,FC2,,FC9
, bueno tendré que aumentar las líneas when ... then ...



Diego M Romero

"jeastman" escribió en el mensaje
news:%
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





Respuesta Responder a este mensaje
#5 Jose Antonio
03/11/2007 - 21:32 | Informe spam
Si esta consulta vas a realizarla habitualmente, yo crearia una vista
indexada va ha ser mucho mas eficiente que cualquier consulta.

"Diego Romero" escribió en el mensaje de noticias
news:
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

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida