Seleccionar filas para una clave (de dos columnas) y un periodo.

11/01/2007 - 16:36 por Salvador Ramos | Informe spam
Hola a todos,

Tengo una tabla con movimientos de ventas:
CREATE TABLE [dbo].[Ventas] (
[cliente] [int] NULL ,
[EESS] [int] NULL ,
[num_tarjeta] [char] (19) COLLATE Modern_Spanish_CI_AS NULL ,
[fecha] [smalldatetime] NULL ,
[hora] [varchar] (4) COLLATE Modern_Spanish_CI_AS NULL ,
[canti] [decimal](8, 2) NULL ,
[importe] [decimal](8, 2) NULL ,
[matricula] [char] (10) COLLATE Modern_Spanish_CI_AS NULL ,
) ON [PRIMARY]

Y otra tabla donde se indican los datos que deben ser seleccionados:
CREATE TABLE [dbo].[DatosSelec] (
[Cliente] [int] NOT NULL ,
[EESS] [int] NOT NULL ,
[FechaInicio] [smalldatetime] NOT NULL ,
[FechaFin] [smalldatetime] NOT NULL
) ON [PRIMARY]
Ejemplo de datos:
1 1 01-01-06 31-01-06
1 2 01-01-06 15-02-06
Necesito obtener todos las filas de Ventas, de los clientes y EESS que
existen en DatosSelec, pero sólo para los periodos comprendidos entre
FechaInicio y FechaFin de dicho cliente y EESS.
En el ejemplo anterior, necesito obtener las ventas del cliente 1 en la EESS
1 desde el 01-01-06 al 31-01-06, y del cliente 1 en la EESS 2 desde el
01-01-06 al 15-02-06.

Tengo una solución basada en cursores, pero me gustaría obtener una mejor
solución, ya que afectará a un gran número de filas este proceso, y se
ejecutará periódicamente.

Muchas gracias

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server / MCTS: SQL Server 2005]
www.helpdna.net (información sobre SQL Server y .NET)
Y ahora también en www.sqlserverymicrosoft.net
 

Leer las respuestas

#1 Salvador Ramos
11/01/2007 - 18:40 | Informe spam
Muchas gracias Alejandro,

Como la columna fecha siempre lleva las 0 horas, voy a cambiar:
and v,fecha >= d.FechaInicio
and v.fecha < dateadd(day, 1, convert(char(8), d.FechaFin, 112))



and v.fecha between d.FechaInicio and d.FechaFin

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server / MCTS: SQL Server 2005]
www.helpdna.net (información sobre SQL Server y .NET)
Y ahora también en www.sqlserverymicrosoft.net


"Alejandro Mesa" escribió en el
mensaje news:
Salvador,

Trata lo sgte:

select
v.*
from
[dbo].[Ventas] as v
inner join
[dbo].[DatosSelec] as d
on v.cliente = d.cliente
and v.EESS = d.EESS
and v,fecha >= d.FechaInicio
and v.fecha < dateadd(day, 1, convert(char(8), d.FechaFin, 112))
go

La expresion "dateadd(day, 1, convert(char(8), d.FechaFin, 112))" es para
incluir todas las ventas del dia final.


Saludos,

Alejandro Mesa


"Salvador Ramos" wrote:

Hola a todos,

Tengo una tabla con movimientos de ventas:
CREATE TABLE [dbo].[Ventas] (
[cliente] [int] NULL ,
[EESS] [int] NULL ,
[num_tarjeta] [char] (19) COLLATE Modern_Spanish_CI_AS NULL ,
[fecha] [smalldatetime] NULL ,
[hora] [varchar] (4) COLLATE Modern_Spanish_CI_AS NULL ,
[canti] [decimal](8, 2) NULL ,
[importe] [decimal](8, 2) NULL ,
[matricula] [char] (10) COLLATE Modern_Spanish_CI_AS NULL ,
) ON [PRIMARY]

Y otra tabla donde se indican los datos que deben ser seleccionados:
CREATE TABLE [dbo].[DatosSelec] (
[Cliente] [int] NOT NULL ,
[EESS] [int] NOT NULL ,
[FechaInicio] [smalldatetime] NOT NULL ,
[FechaFin] [smalldatetime] NOT NULL
) ON [PRIMARY]
Ejemplo de datos:
1 1 01-01-06 31-01-06
1 2 01-01-06 15-02-06
Necesito obtener todos las filas de Ventas, de los clientes y EESS que
existen en DatosSelec, pero sólo para los periodos comprendidos entre
FechaInicio y FechaFin de dicho cliente y EESS.
En el ejemplo anterior, necesito obtener las ventas del cliente 1 en la
EESS
1 desde el 01-01-06 al 31-01-06, y del cliente 1 en la EESS 2 desde el
01-01-06 al 15-02-06.

Tengo una solución basada en cursores, pero me gustaría obtener una mejor
solución, ya que afectará a un gran número de filas este proceso, y se
ejecutará periódicamente.

Muchas gracias

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server / MCTS: SQL Server 2005]
www.helpdna.net (información sobre SQL Server y .NET)
Y ahora también en www.sqlserverymicrosoft.net




Preguntas similares