SQL Server - ayuda construcción de Query registro anterior al actual.

 
Vista:
sin imagen de perfil

ayuda construcción de Query registro anterior al actual.

Publicado por MARKO (11 intervenciones) el 18/01/2013 19:39:32
Saludos Por adelantado agradezco su ayuda.

Cuento con una base de datos de Microsoft SQL Server 2005 y necesito crear una query de la siguiente manera:

Cuento con dos tablas:
-poe
-ldm

La tabla poe cuenta con los siguientes campos: idgen, fecha, hora, poe y valoracion.
Por cada fecha, el idgen con hora,poe y una valorización pueden aparecer desde 0 hasta 24 veces, o sea 24 registros.

La tabla ldm cuenta con los siguientes campos: idldm (este es correlativo), fecha, idgen, costovarmin, costovarmed y costovarmax.
Por cada fecha el idgen y los costos solo aparecen una vez. pero a su vez por cada fecha hay 197 igen más y cada uno cuenta con sus costos respectivos.

Lo que yo necesito hacer es una consulta de un año completo '2012-01-01' hasta '2012-12-31' en donde el resultado aparezca algo así:

1
idgen   fecha  hora  poe  valoracion  costovarmin  costovarmed  costovarmax



La verdad es que el problema no es muy complejo, ya que las dos tablas se conectan por la fecha y más relevantemente por el idgen, así que la query no es tan difícil.

1
2
3
4
5
6
7
8
9
10
11
12
USE gencos;
Declare @idgen varchar(6);
Set @idgen = '2';
Declare @fechainicio varchar(10);
Set @fechainicio = '2012-01-01';
Declare @fechafin varchar(10);
Set @fechafin = '2012-12-31';
 
SELECT poe.idgen, poe.fecha, poe.hora, poe.poe, poe.valoracion, ldm.costovarmin, ldm.costovarmed, ldm.costovarmax
FROM poe,ldm
WHERE poe.fecha between @fechainicio and @fechafin and poe.fecha = ldm.fecha and poe.idgen = @idgen and
poe.idgen = ldm.idgen order by fecha, hora;


La dificultad es que para una fecha específica los costos variables que yo necesito no son los del idgen en cuestión sino los costos del registro anterior al idgen mencionado en ldm (aquí se ve la gran importancia que tiene el campo idldm ya que es el correlativo por lo cual lo utilizo para buscar el anterior en la tabla ldm.

A continuación coloco los dos queries que uso para sacar los datos pero no he podido conectarlos.

1
2
3
4
5
6
7
8
9
10
11
12
13
/* este query funciona bien*/
 
USE gencos
Declare @idgen varchar(6);
Set @idgen = '2';
Declare @fechainicio varchar(10);
Set @fechainicio = '2012-01-01';
Declare @fechafin varchar(10);
Set @fechafin = '2012-12-31';
 
SELECT fecha, hora, poe, valoracion
FROM poe
WHERE fecha BETWEEN @fechainicio AND @fechafin AND idgen = @idgen order by fecha, hora;


El query anterior funciona sin complicaciones, pero ahora

1
2
3
SELECT TOP(1) costovarmin, costovarmed, costovarmax
FROM ldm
WHERE idldm < (SELECT idldm FROM ldm WHERE idgen= @idgen AND fecha = '2012-01-01') ORDER BY IDLDM DESC;


este query si me funciona y me da los 3 valores de costos para el idgen anterior en la fecha en cuestión pero:

1) solo sirve para un día y yo lo necesito para un rango de días
2) no tengo idea de cómo conectar los resultados de este query con los resultados del primer query
¿Ideas?

Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

ayuda construcción de Query registro anterior al actual.

Publicado por Libras (8 intervenciones) el 18/01/2013 21:18:05
Si pusieras un ejemplo de tus datos, que es lo que obtienes en cada uno de los querys y el resultado que esperas, se te podria ayudar mas facil :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

ayuda construcción de Query registro anterior al actual.

Publicado por MARKO (11 intervenciones) el 18/01/2013 23:22:15
ok un ejemplo la tabla poe está de la siguiente manera:

-------------fecha---------hora----- idgen----poe------- valoracion
2012-01-01 00:00:00---3-----------7------123.99----81849.15
2012-01-01 00:00:00---4-----------7------123.99----76739.39
2012-01-01 00:00:00---5-----------2------85.33------52228.37
2012-01-01 00:00:00---6-----------2------ 85.33-----51989.46
2012-01-01 00:00:00---7-----------61---- 27.58-----15134.00
.
.
2012-01-02 00:00:00---21-------7-------124.42------136637.23
2012-01-02 00:00:00---22------204----103.30-------96421.50
2012-01-02 00:00:00---23------ 2------- 85.27-------65849.87
2012-01-02 00:00:00---24------ 2--------85.27-------59804.22
.
.
.
2012-12-09 00:00:00---21--------7------135.32------157330.75
2012-12-09 00:00:00---22--------7------135.32------125466.76
2012-12-09 00:00:00---23--------2------131.14------102573.25
2012-12-09 00:00:00---24--------2------131.14-------93288.70
.
.
.
2012-12-31 00:00:00---3----------8-------85.44--------82707.78

y la tabla ldm

idldm----------------fecha-----------------idgen----costomin--costomed--------costomax
175455---2012-01-01 00:00:00------85----------30.6----------30.6----------------30.6
175456---2012-01-01 00:00:00------197--------78.14--------32.64--------------102.82 ##
175457 2012-01-01 00:00:00------2------------84.3--------- 84.29--------------84.3
175458 2012-01-01 00:00:00------45-----------91.3---------91.30--------------91.30
175459 2012-01-01 00:00:00------178---------99.59--------99.59------------- 99.59
.
.
.
.
175528---2012-01-02 00:00:00------61--------------- 25---------- 25----------------25
175529-- 2012-01-02 00:00:00------185--------------30.6--------30.6--------------30.6 ##
175530---2012-01-02 00:00:00------2-----------------84.3--------84.3--------------84.3
175531---2012-01-02 00:00:00------45----------------91.3--------91.3-------------91.3
175532---2012-01-02 00:00:00------178--------------99.58------99.58-----------99.59
.
.
.
203091---2012-12-09 00:00:00------158--------------127.80-----127.81--------127.81
203092---2012-12-09 00:00:00------103--------------134.3-------134.29--------134.3 ##
203093---2012-12-09 00:00:00------2------------------130.73-----130.73--------130.73
203094---2012-12-09 00:00:00------88----------------155.36-----155.36--------155.36
203095 2012-12-09 00:00:00------7------------------132.9-------132.9----------132.9



Necesito crear un query que relacione los costos variables de la tabla ldm con los datos de la tabla poe pero los costos que me interesan no son los de la unidad idgen en cuestion sino los del registro anterior al idgen en la tabla ldm

para nuestro ejemplo tomaré como idgen en cuestion el número 2 por lo cual los costos variables que me interesan son los que están marcados con el signo ###


el resultado debería ser el siguiente

fecha------------------------hora-----idgen---poe------valoracion---costomin----costomed----costomax
2012-01-01 00:00:00---5---------2---------85.33-----52228.37----78.14--------32.64-----------102.82
2012-01-01 00:00:00---6---------2---------85.33-----51989.46----78.14--------32.64-----------102.82
2012-01-02 00:00:00---23-------2---------85.27-----65849.87-----30.6---------30.6-------------30.6
2012-01-02 00:00:00---24-------2---------85.27-----59804.22-----30.6---------30.6-------------30.6
2012-12-09 00:00:00---23-------2---------131.14---102573.25----134.3-------134.29----------134.3
2012-12-09 00:00:00---24-------2---------131.14----93288.70-----134.3-------134.29----------134.3

Gracias por adelantado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ayuda construcción de Query registro anterior al actual.

Publicado por Libras (8 intervenciones) el 19/01/2013 21:40:31
Con los datos que presentas quedaria de esta manera:

create table #poe
(
fecha datetime,
hora int,
idgen int,
poe decimal(18,2),
valoracion decimal(18,2)
)


-------------fecha---------hora----- idgen----poe------- valoracion

insert into #poe values ('2012-01-01 00:00:00',3,7,123.99,81849.15)
insert into #poe values ('2012-01-01 00:00:00',4,7,123.99,76739.39)
insert into #poe values ('2012-01-01 00:00:00',5,2,85.33,52228.37)
insert into #poe values ('2012-01-01 00:00:00',6,2,85.33,51989.46)
insert into #poe values ('2012-01-01 00:00:00',7,61,27.58,15134.00)
insert into #poe values ('2012-02-01 00:00:00',21,7,124.42,136637.23)
insert into #poe values ('2012-02-01 00:00:00',22,204,103.30,96421.50)
insert into #poe values ('2012-02-01 00:00:00',23,2,85.27,65849.87)
insert into #poe values ('2012-02-01 00:00:00',24,2,85.27,59804.22)
insert into #poe values ('2012-09-12 00:00:00',21,7,135.32,157330.75)
insert into #poe values ('2012-09-12 00:00:00',22,7,135.32,125466.76)
insert into #poe values ('2012-09-12 00:00:00',23,2,131.14,102573.25)
insert into #poe values ('2012-09-12 00:00:00',24,2,131.14,93288.70)
insert into #poe values ('2012-31-12 00:00:00',3,8,85.44,82707.78)


y la tabla ldm

create table #ldm(
idldm int,
fecha datetime,
idgen int,
customin decimal(18,2),
customed decimal(18,2),
customax decimal(18,2)
)
idldm----------------fecha-----------------idgen----costomin--costomed--------costomax
insert into #ldm values (175455,'2012-01-01 00:00:00',85,30.6,30.6,30.6)
insert into #ldm values (175456,'2012-01-01 00:00:00',197,78.14,32.64,102.82)-- ##
insert into #ldm values (175457,'2012-01-01 00:00:00',2,84.3,84.29,84.3)
insert into #ldm values (175458,'2012-01-01 00:00:00',45,91.3,91.30,91.30)
insert into #ldm values (175459,'2012-01-01 00:00:00',178,99.59,99.59,99.59)
insert into #ldm values (175528,'2012-02-01 00:00:00',61,25,25,25)
insert into #ldm values (175529,'2012-02-01 00:00:00',185,30.6,30.6,30.6)-- ##
insert into #ldm values (175530,'2012-02-01 00:00:00',2,84.3,84.3,84.3)
insert into #ldm values (175531,'2012-02-01 00:00:00',45,91.3,91.3,91.3)
insert into #ldm values (175532,'2012-02-01 00:00:00',178,99.58,99.58,99.59)
insert into #ldm values (203091,'2012-09-12 00:00:00',158,127.80,127.81,127.81)
insert into #ldm values (203092,'2012-09-12 00:00:00',103,134.3,134.29,134.3)-- ##
insert into #ldm values (203093,'2012-09-12 00:00:00',2,130.73,130.73,130.73)
insert into #ldm values (203094,'2012-09-12 00:00:00',88,155.36,155.36,155.36)
insert into #ldm values (203095,'2012-09-12 00:00:00',7,132.9,132.9,132.9)


select t3.fecha,t3.hora,t3.idgen,t3.poe,t3.valoracion,t4.customin,t4.customed,t4.customax from(
select t1.fecha,t1.hora,t1.idgen,t1.poe,t1.valoracion,t2.idldm from #poe as t1
inner join #ldm as t2 on (t1.idgen=t2.idgen and t1.fecha=t2.fecha)
where t1.idgen=2) as t3 left join #ldm as t4 on (t3.idldm=t4.idldm+1)
group by t3.fecha,t3.hora,t3.idgen,t3.poe,t3.valoracion,t4.customin,t4.customed,t4.customax

fecha------------------------hora-----idgen---poe------valoracion---costomin----costomed----costomax
2012-01-01 00:00:00---5---------2---------85.33-----52228.37----78.14--------32.64-----------102.82
2012-01-01 00:00:00---6---------2---------85.33-----51989.46----78.14--------32.64-----------102.82
2012-01-02 00:00:00---23-------2---------85.27-----65849.87-----30.6---------30.6-------------30.6
2012-01-02 00:00:00---24-------2---------85.27-----59804.22-----30.6---------30.6-------------30.6
2012-12-09 00:00:00---23-------2---------131.14---102573.25----134.3-------134.29----------134.3
2012-12-09 00:00:00---24-------2---------131.14----93288.70-----134.3-------134.29----------134.3
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

ayuda construcción de Query registro anterior al actual.

Publicado por MARKO (11 intervenciones) el 21/01/2013 16:42:14
Muchisimas gracias Libras funcionó de lo mejor

select t3.fecha,t3.hora,t3.idgen,t3.poe,t3.valoracion,t4.customin,t4.customed,t4.customax from(
select t1.fecha,t1.hora,t1.idgen,t1.poe,t1.valoracion,t2.idldm from #poe as t1
inner join #ldm as t2 on (t1.idgen=t2.idgen and t1.fecha=t2.fecha)
where t1.idgen=2) as t3 left join #ldm as t4 on (t3.idldm=t4.idldm+1)
group by t3.fecha,t3.hora,t3.idgen,t3.poe,t3.valoracion,t4.customin,t4.customed,t4.customax


me gustaría saber si podrias explicarme a grandes rasgos la lógica de funcionamiento del Query

Gracias por adelantado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ayuda construcción de Query registro anterior al actual.

Publicado por Libras (8 intervenciones) el 21/01/2013 17:05:23
La logica del query....primero obtienes

los registros que tienen el idgen=2 asi como su respectivo idldm(ya que tu necesitas el idldm-1 :P) haciendo un left join con las 2 tablas uniendo por idgen y por fecha.
Query1:
select t1.fecha,t1.hora,t1.idgen,t1.poe,t1.valoracion,t2.idldm from #poe as t1
inner join #ldm as t2 on (t1.idgen=t2.idgen and t1.fecha=t2.fecha)
where t1.idgen=2


Despues se hace un subquery, usando el resultado del primer query, haciendo un left join del resultado con la tabla que tiene los idldm(esto para poder sacar el idldm-1 que es lo que necesitamos) y presentamos los valores de este ultimo join que son los que traen los valores que tu necesitas :)

select t3.fecha,t3.hora,t3.idgen,t3.poe,t3.valoracion,t4.customin,t4.customed,t4.customax from(
Query 1
) as t3 left join #ldm as t4 on (t3.idldm=t4.idldm+1)
group by t3.fecha,t3.hora,t3.idgen,t3.poe,t3.valoracion,t4.customin,t4.customed,t4.customax

Espero haberme explicado :P
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

ayuda construcción de Query registro anterior al actual.

Publicado por MARKO (11 intervenciones) el 22/01/2013 23:07:13
muchisimas gracias man,

una pregunta ¿que cambios hay que hacer en el query si los datos que me interesan en vez de ser los del registro anterior ahora fueran los del registro siguiente?

¿o si me interesaran los datos de los registros x posiciones adelante o atrás?

saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar