Originariamente inviato da agenti
la cosa è spiegata piuttosto bene...
...non hai detto se, per un albergo, i periodi 'DAL' 'AL' possono avere dei giorni in comune oppure no.
nella seconda ipotesi (ogni periodo di un albergo ha in comune con l'altro *solo* inizio e fine)
potresti provare con una query (che temo decisamente poco performante putroppo)
come segue;
l'ho provata su Access 2000 con 15/01/2006 - 29/01/2006 come periodo di ricerca
e con questi dati :
codice:
IDAbergo Dal Al CL
------------------------------------------------------------------------
1 01/01/2006 02/01/2006 1
1 05/01/2006 06/01/2006 1
1 06/01/2006 07/01/2006 1
1 10/01/2006 12/01/2006 1
1 12/01/2006 15/01/2006 1
1 15/01/2006 20/01/2006 1
1 20/01/2006 30/01/2006 1
2 10/01/2006 12/01/2006 1
2 12/01/2006 15/01/2006 1
2 15/01/2006 20/01/2006 1
2 20/01/2006 29/01/2006 1
ho ottenuto questo risultato
TipoRec IDAbergo DAL AL
------------------------------------------------------------------------
N1 1 15/01/2006 30/01/2006
N1 2 15/01/2006 29/01/2006
N2 1 10/01/2006 30/01/2006
N2 2 10/01/2006 29/01/2006
la query con tipo record N2 è quella che ti torna un solo
record nel caso di almeno 3 periodi 'Attigui';
quella con tipo record N1 tiene conto invece
di soli 2 periodi 'Attigui';
...vedi tu se può andare e, nel caso, come migliorarla;
codice:
SELECT QAzz.*
FROM
(
SELECT 'N0' as TipoRec, T1.IDAbergo, T1.DAL AS DAL, T1.AL AS AL
FROM Tabella2 T1
***EDIT qui ovviamente va aggiunto : WHERE T1.CL>0 ********
UNION ALL
SELECT 'N1' as TipoRec , T1.IDAbergo, T1.DAL , T2.AL
FROM Tabella2 T1
INNER JOIN Tabella2 AS T2 ON (T1.IDAbergo=T2.IDAbergo) AND (T1.Al=T2.Dal)
WHERE T1.CL>0 and T2.CL>0
UNION ALL
SELECT 'N2' as TipoRec , Q1.IDAbergo AS IDAlbergo, MIN(Q1.T1_DAL) AS DAL, MAX(Q2.T2_AL) AS AL
FROM
(SELECT T1.IDAbergo, T1.Dal AS T1_DAL ,T1.Al as T1_AL,T2.Dal as T2_DAL, T2.Al as T2_AL
FROM Tabella2 T1
INNER JOIN Tabella2 AS T2 ON (T1.IDAbergo=T2.IDAbergo) AND (T1.Al=T2.Dal)
WHERE T1.CL>0 and T2.CL>0 ) AS Q1
INNER JOIN
(SELECT T1.IDAbergo, T1.Dal AS T1_DAL ,T1.Al as T1_AL,T2.Dal as T2_DAL, T2.Al as T2_AL
FROM Tabella2 T1
INNER JOIN Tabella2 AS T2 ON (T1.IDAbergo=T2.IDAbergo) AND (T1.Al=T2.Dal)
WHERE T1.CL>0 and T2.CL>0 ) AS Q2
ON (Q1.IDAbergo=Q2.IDAbergo) AND (Q1.T1_AL=Q2.T1_DAL)
GROUP BY Q1.IDAbergo
) AS QAzz
WHERE DAL<=#01/15/2006# AND AL>=#01/29/2006#