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

Preguntas similare

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


Respuesta Responder a este mensaje
#2 Alejandro Mesa
21/05/2007 - 15:56 | Informe spam
Mickro,

Seguro que Javier quizo decir:

SELECT
od.Descripcion,
SUM(od.Importe) as sum_importe
FROM
dbo.tblVentas as oh
inner join
dbo.tblDetalleVentas as od
on oh.IDVenta = od.IDVenta
WHERE
od.Fecha BETWEEN @Fecha and od.Fecha < dateadd(day, 1, @Fecha))
GROUP BY
od.Descripcion
go

Si normalizas la tabla [tblDetalleVentas], entonces:

SELECT
p.Descripcion,
SUM(od.Importe) as sum_importe
FROM
dbo.tblVentas as oh
inner join
dbo.tblDetalleVentas as od
on oh.IDVenta = od.IDVenta
inner join
dbo.Producto as p
on p.ProductoID = od.ProductoID
WHERE
od.Fecha BETWEEN @Fecha and od.Fecha < dateadd(day, 1, @Fecha))
GROUP BY
p.Descripcion
go


AMB



"Javier Loria" wrote:

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
desempeo.
2) Porque tienes descripcion el detalle de ventas?, eso parece mas bien
parte del producto, y deberia almacenarse el cdigo 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 da 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
>
>

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida