Insert masivo -> Novato TOTAL

07/10/2007 - 00:36 por David | Informe spam
Microsoft SQL Server 2000

Muy buenas, dado el siguiente escenario

TablaOrigen
-
FechaInicio FechaFin Tipo Cantidad

Los campos FechaInicio y FechaFin definen un periodo (por ejemplo del
01/01/2007 al 10/01/2007 AMBOS INCLUSIVE)
Esta tabla contiene MILES de registros del tipo

01/01/2007 10/01/2007 T1 1.000


TablaDestino
-
Dia Tipo Cantidad

Tabla vacía


Es posible realizar un INSERT masivo para cargar la TablaDestino "día a día"
desde la TablaOrigen que define los periodos
01/01/2007 T1 1.000
02/01/2007 T1 1.000
03/01/2007 T1 1.000
...
10/01/2007 T1 1.000


De antemano muchísimas gracias

Preguntas similare

Leer las respuestas

#1 David
07/10/2007 - 00:45 | Informe spam
Uhhhhh!!! se me olvidó lo más importante:

TablaOrgien
-

Define el periodo y el día de la semana que se aplica, es decir

TablaOrigen
-
FechaInicio FechaFin LUNES MARTES DOMINGO Tipo Cantidad

Lunes, Martes, Miércoles, ..., domingo son campos booleanos que indican
cuando se "aplica la cantidad", pero para el caso en cuestión que es
insertar en la TablaDestino:

TablaDestino
-
Dia Tipo Cantidad

Sólo se insertan registros en esta tabla cuando el día de la semana es TRUE

Ejemplo:

TablaOrigen
07/10/2007 14/10/2007 FALSE FALSE FALSE FALSE FALSE
TRUE TRUE T1 1.000

TablaDestino
07/10/2007 T1 1.000
13/10/2007 T1 1.000
14/10/2007 T1 1.000

Sólo ha insertado TRES registros, en el periodo indicado los
correspondientes a los sábados y domingos (es un ejemplo, perfectamente
podrían haber sido en el periodo indicado los lunes, jueves y viernes)
Respuesta Responder a este mensaje
#2 Alejandro Mesa
07/10/2007 - 02:10 | Informe spam
Hola David,

Para este tipo de problemas, se recomienda se postee la estructura de las
tablas involucradas, incluyendo restricciones e indices, asi como data de
ejemplo en forma de sentencias "insert", y resultados esperados. La ayuda
debe ser mutua, no crees?


AMB


"David" wrote:

Uhhhhh!!! se me olvidó lo más importante:

TablaOrgien
-

Define el periodo y el día de la semana que se aplica, es decir

TablaOrigen
-
FechaInicio FechaFin LUNES MARTES DOMINGO Tipo Cantidad

Lunes, Martes, Miércoles, ..., domingo son campos booleanos que indican
cuando se "aplica la cantidad", pero para el caso en cuestión que es
insertar en la TablaDestino:

TablaDestino
-
Dia Tipo Cantidad

Sólo se insertan registros en esta tabla cuando el día de la semana es TRUE

Ejemplo:

TablaOrigen
07/10/2007 14/10/2007 FALSE FALSE FALSE FALSE FALSE
TRUE TRUE T1 1.000

TablaDestino
07/10/2007 T1 1.000
13/10/2007 T1 1.000
14/10/2007 T1 1.000

Sólo ha insertado TRES registros, en el periodo indicado los
correspondientes a los sábados y domingos (es un ejemplo, perfectamente
podrían haber sido en el periodo indicado los lunes, jueves y viernes)




Respuesta Responder a este mensaje
#3 Carlos M. Calvelo
07/10/2007 - 14:10 | Informe spam
On 7 okt, 00:45, "David" wrote:
Uhhhhh!!! se me olvidó lo más importante:

TablaOrgien
-

Define el periodo y el día de la semana que se aplica, es decir

TablaOrigen
-
FechaInicio FechaFin LUNES MARTES DOMINGO Tipo Cantidad

Lunes, Martes, Miércoles, ..., domingo son campos booleanos que indican
cuando se "aplica la cantidad", pero para el caso en cuestión que es
insertar en la TablaDestino:

TablaDestino
-
Dia Tipo Cantidad

Sólo se insertan registros en esta tabla cuando el día de la semana es TRUE

Ejemplo:

TablaOrigen
07/10/2007 14/10/2007 FALSE FALSE FALSE FALSE FALSE
TRUE TRUE T1 1.000

TablaDestino
07/10/2007 T1 1.000
13/10/2007 T1 1.000
14/10/2007 T1 1.000

Sólo ha insertado TRES registros, en el periodo indicado los
correspondientes a los sábados y domingos (es un ejemplo, perfectamente
podrían haber sido en el periodo indicado los lunes, jueves y viernes)



Hola David,

Una forma de hacerlo:


create function Fechas(@mindate datetime, @maxdate datetime)
returns @fechas TABLE (fecha datetime, dayofweek int)
as
begin
while @mindate <= @maxdate
begin
insert into @fechas (fecha,dayofweek)
values (@mindate, datepart(weekday, @mindate))
set @mindate = @mindate + 1
end
return
end


declare @FechaMin datetime
declare @FechaMax datetime
select @FechaMin=min(FechaInicio),
@FechaMax=max(FechaFin)
from TablaOrigen


set datefirst 1 --1=lunes,2=martes,...,7=domingo

select F.fecha,O.Tipo,O.Cantidad
from tablaorigen O join dbo.fechas(@FechaMin, @FechaMax) F
on F.fecha between O.FechaInicio and O.FechaFin
where (O.lunes=1 and F.dayofweek=1) or
(O.martes=1 and F.dayofweek=2) or
(O.miercoles=1 and F.dayofweek=3) or
(O.jueves=1 and F.dayofweek=4) or
(O.viernes=1 and F.dayofweek=5) or
(O.sabado=1 and F.dayofweek=6) or
(O.domingo=1 and F.dayofweek=7)


insert into TablaDestino(Dia,Tipo,Cantidad)
<select...: el_select_anterior>

Saludos,
Carlos
Respuesta Responder a este mensaje
#4 David
07/10/2007 - 15:06 | Informe spam
TablaOrigen
-

FechaInicio
FechaFin
Lunes (boolean)
Martes (boolean)
Miercoles (boolean)
Jueves (boolean)
Viernes (boolean)
Sábado (boolean)
Domingo (boolean)
Tipo
Cantidad

Periodo indicado por [FechaInicio,FechaFin] (ambos inclusive)
Los días de la semana indican cuando es "válida" la cantidad (cuando se
aplica)

01/01/2007 10/01/2007 T T T T T F F Tipo1 1.000
11/01/2007 15/01/2007 F F T T T F T Tipo1 2.000

(Esta tabla tiene MILES de registro)

TablaDestino
-

Día
Tipo
Cantidad

(Tabla vacía)

Cargar esta tabla con los datos de TablaOrigen, "día a día" teniendo en
cuenta de añadir registros para días de la semana a TRUE, es decir si en la
TablaOriegen existe un registro como este:

01/01/2007 10/01/2007 T T T T T F F Tipo1 1.000

Sólo añade los días comprendidos entre el 01/01/2007 al 01/10/2007 (ambos
inclusive) que "caigan" en lunes, martes, miércoles, jueves y viernes, NO
añade días que "caigan" en sábado o domingo

TablaDestino
01/01/2007 Tipo1 1.000 -- Lunes
02/01/2007 Tipo1 1.000 -- Martes
03/01/2007 Tipo1 1.000 -- Miércoles
04/01/2007 Tipo1 1.000 -- Jueves
05/01/2007 Tipo1 1.000 -- Viernes
08/01/2007 Tipo1 1.000 -- Lunes
09/01/2007 Tipo1 1.000 -- Martes
10/01/2007 Tipo1 1.000 -- Miércoles


Gracias por TÚ TIEMPO, insisto MIL GRACIAS por tú interés, gracias, le estoy
echando un rato a tú post, ya comentaré como me ha ido.
Respuesta Responder a este mensaje
#5 Carlos M. Calvelo
07/10/2007 - 16:16 | Informe spam
Hola David,

On 7 okt, 15:06, "David" wrote:
TablaOrigen
-

FechaInicio
FechaFin
Lunes (boolean)
Martes (boolean)
Miercoles (boolean)
Jueves (boolean)
Viernes (boolean)
Sábado (boolean)
Domingo (boolean)
Tipo
Cantidad

Periodo indicado por [FechaInicio,FechaFin] (ambos inclusive)
Los días de la semana indican cuando es "válida" la cantidad (cuando se
aplica)

01/01/2007 10/01/2007 T T T T T F F Tipo1 1.000
11/01/2007 15/01/2007 F F T T T F T Tipo1 2.000




Nos dices que las columnas Lunes..Domingo son del tipo
boolean, que no existe, y luego nos dejas ver valores T y F.
De que tipo son estos? char?
Si es así, donde en el where yo comparo con 1, tendrás
que comparar con 'T'.
Por ejemplo O.lunes='T' en vez de O.lunes = 1

No es por nada que Alejandro pedía mas información.
Información con códico (create table..., etc) para poder
simular tu situación lo mejor posible.
Pero podrás adaptar fácimente la solución que yo envié
si hay mas diferencias de ese tipo.

(Esta tabla tiene MILES de registro)
>
TablaDestino
-

Día
Tipo
Cantidad

(Tabla vacía)

Cargar esta tabla con los datos de TablaOrigen, "día a día" teniendo en
cuenta de añadir registros para días de la semana a TRUE, es decir si en la
TablaOriegen existe un registro como este:

01/01/2007 10/01/2007 T T T T T F F Tipo1 1.000

Sólo añade los días comprendidos entre el 01/01/2007 al 01/10/2007 (ambos
inclusive) que "caigan" en lunes, martes, miércoles, jueves y viernes, NO
añade días que "caigan" en sábado o domingo

TablaDestino
01/01/2007 Tipo1 1.000 -- Lunes
02/01/2007 Tipo1 1.000 -- Martes
03/01/2007 Tipo1 1.000 -- Miércoles
04/01/2007 Tipo1 1.000 -- Jueves
05/01/2007 Tipo1 1.000 -- Viernes
08/01/2007 Tipo1 1.000 -- Lunes
09/01/2007 Tipo1 1.000 -- Martes
10/01/2007 Tipo1 1.000 -- Miércoles




Así lo había entendido.



Gracias por TÚ TIEMPO, insisto MIL GRACIAS por tú interés, gracias, le estoy
echando un rato a tú post, ya comentaré como me ha ido.



Seguro que sales del apuro. :) Suerte!

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