SQL - Combinar Tablas segun Fechas

 
Vista:

Combinar Tablas segun Fechas

Publicado por Jose Luis (4 intervenciones) el 20/08/2007 09:33:52
Buenas;

Tengo un pequeño problemilla que no se como resolver.

Tengo una tabla con campos similares a estos;

Tabla1

Concepto Importe Tabla Mes Año

00001 10 1 1 2000
00001 11 1 2 2000
00003 13 1 7 2000
00006 10 1 1 2001
00008 9 1 7 2001

Y otras tablas que son como la siguiente

Tabla 2

Tabla Destino Año Mes Porcentaje
1 AL 2000 1 0.51
1 DD 2000 1 0.49
1 AL 2000 5 0.56
1 DD 2000 5 0.44
1 AL 2001 1 0.26
1 DD 2001 1 0.74
1 AL 2001 2 0.5
1 DD 2001 2 0.5

Tengo que multiplicar el Importe de la Tabla1 por los porcentajes de la tabla2 que estuvieran vigentes en cada momento. Mi problema esta en que la tabla 2 no tiene registros de todos los meses, solo guarda un registro cuando se modifica y no se como decirle que me coja el ultimo mes desde la fecha del importe.

¿Se os ocurre alguna solución?

Muchas Gracias

Un saludo
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

RE:Combinar Tablas segun Fechas

Publicado por Isaias (5072 intervenciones) el 20/08/2007 18:02:33
1.- ¿Que base de datos manejas?
2.- ¿Tu llave de JOIN es TABLA+MES+AÑO?
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

RE:Combinar Tablas segun Fechas

Publicado por Jose Luis (4 intervenciones) el 20/08/2007 20:48:04
Muchas Gracias por el interes mostrado en mi problema, Isaias. Llevo semanas trabajando en esto, me he atascado aqui y no veo salida

La BD de datos es SQL, importo los datos de un as400 a unas tablas que me he creado y actualizo todas las noches.

Lo primero que pense es:

Select t2.destino, t2.porcentaje *t1.importe
from tabla1 as t1, tabla2 as t2
where t1.año=t2.año
and t1.mes = t2.mes

Y esto funciona cuando en la tabla2 existe el mes, logicamente. Pero el as400 solo me registra cuando hay un cambio en esta tabla y eso no ocurre todos los meses ni mucho menos. Por lo tanto tengo que casar los datos de la tabla1 con los datos del ultimo mes validos. Por si no me explico te pongo un ejemplo:

Tengo datos en la tabla 1 de Junio, en la tabla 2 de Febrero y Septiembre. Tendria que multiplicar el importe de la tabla1 por el porcentaje de la tabla 2 de Febrero.

Lo he intentado con:

Select t2.destino, t2.porcentaje *t1.importe
from tabla1 as t1, tabla2 as t2
where t1.año=t2.año
and t2.mes => ALL (Select t2.mes from tabla2 as t2, tabla1 as t1 Where t1.mes>= t2.mes)

Pero con esto consigo que me devuelva el valor más alto de los meses de la tabla2 y me multiplique el importe por este y no mi objetivo.

Lo he intentado tambien con insertar datos en la tabla2, pero me encuentro con el mismo problema...

Mis conocimientos de sql no son muchos y creo que ya he intentado todo lo que se... Estoy sin ideas!!!!
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

RE:Combinar Tablas segun Fechas

Publicado por Isaias (5072 intervenciones) el 20/08/2007 23:10:31
Podrias decirme QUE BASE DE DATOS ocupas???
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

RE:Combinar Tablas segun Fechas

Publicado por Jose Luis (4 intervenciones) el 21/08/2007 07:57:22
SQL 2000.

Perdon, pensaba que lo habia puesto en el mensaje anterior.
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

RE:Combinar Tablas segun Fechas

Publicado por Isaias (5072 intervenciones) el 21/08/2007 18:16:57
Jose Luis

Mi propuesta, es desarrollar una FUNCION DE USUARIO (UDF).

Lo que te faltaria resolver, es si la misma funcion al no encontrar el mes y año en t2, deba regresarte siempre t2.destino.

-- Creo mi Funcion
CREATE FUNCTION dbo.fn_CalculaColumnas (@año int, @mes int, @importe int)
RETURN INT
AS
BEGIN
DECLARE @CALCULO INT
SET @CALCULO = 0
IF NOT EXISTS(SELECT Porcentaje FROM t2 WHERE Año = @año AND Mes = @mes)
SELECT @CALCULO = @importe * (SELECT MAX(ISNULL(Porcentaje,0)) FROM t2 WHERE Año = @año)
ELSE
SELECT @CALCULO = @importe * (SELECT ISNULL(Porcentaje,0) FROM t2 WHERE Año = @año AND Mes = @mes)
RETURN @CALCULO
END


-- Mi select, utilizando mi funcion y JOIN en lugar de codificacion antigua.
SELECT T2.destino,dbo.fn_CalculaColumnas(t1.año, t1.mes, t1.importe) AS Resultado
FROM tabla1 as t1
JOIN tabla2 as t2
ON t1.año=t2.año
AND t1.mes = t2.mes
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