Select

21/05/2007 - 08:31 por Mickro | Informe spam
Hola, tengo, por ejemplo, la siguiente Tabla llamada tblVentas:

IDVenta (int) (PK)
Fecha (datetime)

en la cual almaceno:

1 19/05/2007
2 19/05/2007
3 20/05/2007
4 20/05/2007

otra tabla llamada tblDetalleVentas

IDVenta (int)(fk)
Descripcion (varchar)
Importe (money)

en la cual se almacena, por ejemplo:

1 Carne 12,00
2 Verdura 2,50
3 Carne 4,55
4 Fiambre 2,35

entonces lo que quiero hacer es saber cuanto (en dinero) vendí de carne,
verdura y fiambre vendí el día 19/05/2007

Lo que hago es:
(select sum(Importe) from tblDetalleVentas where IDVenta in (select IDVenta
from tblVentas where Fecha > @Fecha and Fecha < dateadd(day, 1, @Fecha)) and
Descripcion = 'Carne')
(select sum(Importe) from tblDetalleVentas where IDVenta in (select IDVenta
from tblVentas where Fecha > @Fecha and Fecha < dateadd(day, 1, @Fecha)) and
Descripcion = 'Fiambre')
(select sum(Importe) from tblDetalleVentas where IDVenta in (select IDVenta
from tblVentas where Fecha > @Fecha and Fecha < dateadd(day, 1, @Fecha)) and
Descripcion = 'Verdura')

luego esos valores los pongo en una tabla y los devuelvo a mi aplicacion.

Mi pregunta es si esta bien lo que hago y si hay alguna forma mas eficiente
de hacerlo, ya que para cada consulta tengo que traer gran parte de la tabla
tblVentas. Me imagina que hay una forma de guardar esos datos en una tabla
temporal no?

Gracias y Saludos
 

Leer las respuestas

#1 Javier Loria
21/05/2007 - 08:55 | Informe spam
Hola:
Te falta revisar/aprender la sintaxis del GROUP BY, que seria algo como
asi:
SELECT Descripcion, SUM(Importe)
FROM tblDetalleVentas
GROUP BY Descripcion
WHERE IDVenta BETWEEN @Fecha and Fecha < dateadd(day, 1, @Fecha))
Adicionalmente 2 cosas:
1) No necesitas una tabla temporal. En general tratamos de evitar las tablas
temporales en SQL y solo las usamos cuando nos ayudan a incrementar el
desempeño.
2) Porque tienes descripcion el detalle de ventas?, eso parece mas bien
parte del producto, y deberia almacenarse el código del producto y dejar la
descripcion para la otra tabla.
Saludos,

Javier Loria
Costa Rica (MVP)
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

"Mickro" wrote in message
news:
Hola, tengo, por ejemplo, la siguiente Tabla llamada tblVentas:

IDVenta (int) (PK)
Fecha (datetime)

en la cual almaceno:

1 19/05/2007
2 19/05/2007
3 20/05/2007
4 20/05/2007

otra tabla llamada tblDetalleVentas

IDVenta (int)(fk)
Descripcion (varchar)
Importe (money)

en la cual se almacena, por ejemplo:

1 Carne 12,00
2 Verdura 2,50
3 Carne 4,55
4 Fiambre 2,35

entonces lo que quiero hacer es saber cuanto (en dinero) vendí de carne,
verdura y fiambre vendí el día 19/05/2007

Lo que hago es:
(select sum(Importe) from tblDetalleVentas where IDVenta in (select
IDVenta from tblVentas where Fecha > @Fecha and Fecha < dateadd(day, 1,
@Fecha)) and Descripcion = 'Carne')
(select sum(Importe) from tblDetalleVentas where IDVenta in (select
IDVenta from tblVentas where Fecha > @Fecha and Fecha < dateadd(day, 1,
@Fecha)) and Descripcion = 'Fiambre')
(select sum(Importe) from tblDetalleVentas where IDVenta in (select
IDVenta from tblVentas where Fecha > @Fecha and Fecha < dateadd(day, 1,
@Fecha)) and Descripcion = 'Verdura')

luego esos valores los pongo en una tabla y los devuelvo a mi aplicacion.

Mi pregunta es si esta bien lo que hago y si hay alguna forma mas
eficiente de hacerlo, ya que para cada consulta tengo que traer gran parte
de la tabla tblVentas. Me imagina que hay una forma de guardar esos datos
en una tabla temporal no?

Gracias y Saludos


Preguntas similares