SQL - Sentencia SQL para encontar intervalos de convivencia

 
Vista:

Sentencia SQL para encontar intervalos de convivencia

Publicado por Rubi (1 intervención) el 04/02/2014 12:23:18
Hola,

llevo días intentado hacer una consulta sql y no hay manera. A ver si me podéis ayudar.
La aplicación trabaja con SQL SERVER y con ORACLE. Pondré el ejemplo de la sentencia en ORACLE para poder explicarme.

El problema que tengo es el siguiente, tengo un habitante (solicitante) que pide un documento que muestre las personas que han convivido con él en el mismo domicilio. Hasta aquí bien, el problema lo tengo cuando tanto el solicitante, como las personas que han convivido con él han estado en el domicilio a intervalos de tiempo, ejemplo:

El solicitante (identificador 123) está en el domicilio 1 entre el 01/01/2000 y 20/05/2002, vuelve al mismo domicilio el 28/06/2005 hasta la actualidad.
En este domicilio 1 hay 3 personas:
habitante 1: está en el domicilio 1 desde el 01/01/1996 hasta la actualidad
habitante 2: estuvo en el domicilio 25/08/2002 al 01/05/2003
habitante 3: está en el domicilio desde el 06/08/2004 hasta la actualidad

Mi problema es que busco el máximo y mínimo del solicitante en el domicilio y me da del 01/01/2000 al 28/06/2005 (cosa no correcta ya que del 02/05/2002 al 07/06/2005 no vivía) y por este motivo el habitante número 2 me sale.
Lo mismo me pasa si los intervalos de entrada y salida los tienen los habitantes del domicilio.
La sentencia que tengo es muy larga pero la pondré a trozos:

- Mostrar los domicilio y fechas del solicitante: NHABITA es el identificador del habitante, NDOMICI el identificador del domicilio, FVARIAC la fecha en la que se ha realizado el movimiento, CVARIAC el tipo de movimiento: alta, baja, modificación

SELECT HAV_CPROVIN, HAV_CMUNICI, HAV_NHABITA, HAV_NDOMICI, MIN(HAV_FVARIAC) FSMIN, MAX(HAV_FVARIAC) FSMAX
FROM
(SELECT HAV_CPROVIN, HAV_CMUNICI, HAV_NHABITA, HAV_NDOMICI, HAV_FVARIAC
FROM PMH_HABVAR
WHERE HAV_CPROVIN = 1
AND HAV_CMUNICI = 11
AND HAV_NHABITA = 123
UNION
SELECT HAV_CPROVIN, HAV_CMUNICI, HAV_NHABITA, HAV_NDOMICI,
DECODE(HAV_NVARIAC,999999999,DECODE(HAV_CVARIAC,'B',HAV_FVARIAC,TRUNC(SYSDATE)),HAV_FVARIAC) HAV_FVARIAC
FROM PMH_HABVAR
WHERE HAV_CPROVIN = 1
AND HAV_CMUNICI = 1
AND HAV_NHABITA = 123
) HS
GROUP BY HS.HAV_CPROVIN, HS.HAV_CMUNICI, HS.HAV_NHABITA, HS.HAV_NDOMICI


- Sentencia de los habitantes que conviven en el mismo domicilio que el solicitante:
SELECT HT.HAV_CPROVIN, HT.HAV_CMUNICI, HT.HAV_NDOMICI, HT.HAV_NHABITA,MIN(HT.HAV_FVARIAC) FMIN, MAX(HT.HAV_FVARIAC) FMAX
FROM
(
(SELECT HT1.HAV_CPROVIN, HT1.HAV_CMUNICI, HT1.HAV_NDOMICI, HT1.HAV_NHABITA, HT1.HAV_FVARIAC
FROM
(SELECT HAV_CPROVIN, HAV_CMUNICI, HAV_NDOMICI
FROM PMH_HABVAR
WHERE HAV_CPROVIN = 1
AND HAV_CMUNICI = 1
AND HAV_NHABITA = 123
GROUP BY HAV_CPROVIN, HAV_CMUNICI, HAV_NDOMICI ) H1, PMH_HABVAR HT1
WHERE HT1.HAV_CPROVIN = H1.HAV_CPROVIN
AND HT1.HAV_CMUNICI = H1.HAV_CMUNICI
AND HT1.HAV_NDOMICI = H1.HAV_NDOMICI
)
UNION
(SELECT HT2.HAV_CPROVIN, HT2.HAV_CMUNICI, HT2.HAV_NDOMICI, HT2.HAV_NHABITA, DECODE(HT2.HAV_NVARIAC,999999999,DECODE(HT2.HAV_CVARIAC,'B',HT2.HAV_FVARIAC,TRUNC(SYSDATE)),HT2.HAV_FVARIAC) FMAX
FROM
(SELECT HAV_CPROVIN, HAV_CMUNICI, HAV_NDOMICI
FROM PMH_HABVAR
WHERE HAV_CPROVIN = 1
AND HAV_CMUNICI = 1
AND HAV_NHABITA = 123
GROUP BY HAV_CPROVIN, HAV_CMUNICI, HAV_NDOMICI ) H2, PMH_HABVAR HT2
WHERE HT2.HAV_CPROVIN = H2.HAV_CPROVIN
AND HT2.HAV_CMUNICI = H2.HAV_CMUNICI
AND HT2.HAV_NDOMICI = H2.HAV_NDOMICI
)
)HT
GROUP BY HT.HAV_CPROVIN, HT.HAV_CMUNICI, HT.HAV_NDOMICI, HT.HAV_NHABITA

- A la primera sentencia del solicitante la llamo S, a la segunda sentencia la llamo T donde las fecha FSMIN, FSMAX (mínimo y máximo del solicitante en el domicilio) y FMIN y FMAX (mínimo y máximo de los habitantes que viven en el mismo domicilio que el solicitante) no me tienen en cuenta los intervalos de entrada y salida en dichos domicilios y al comparar estas fechas con menor o mayor según corresponda no me lo hace bien.

Necesito ayuda urgente con este tema. No soy capaz de resolverlo.

Muchísimas gracias por vuestra atención
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