Bonjour,
J'ai une table contenant un historique notamment 4 colonnes :
CODE
LIBELLE
DATE_OUVERTURE
DATE_FERMETURE
On doit avoir le libellé d'un CODE donné pour une plage comprise entre DATE_OUVERTURE et DATE_FERMETURE.
J'ai réussi à remplir cette table ainsi
Et je voudrais trouver les dates de fermetures manquantes, qui sont la date d'ouverture immédiatement supérieure pour le même code.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 CODE libelle DATE_OUVERTURE DATE_FERMETURE 01 lib012007 01/01/2007 NULL 01 lib012007b 01/05/2007 NULL 01 lib012008 01/01/2008 NULL 02 Lib2 2007 01/01/2007 NULL 02 Lib2 2007b 05/06/2007 NULL 03 LIB3 2007 01/01/2007 NULL 04 LIB3 2007 01/01/2007 15/03/2008
Pour l'instant voici ma requête, elle est triangulaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 CODE libelle DATE_OUVERTURE DATE_FERMETURE 01 lib012007 01/01/2007 01/05/2007 01 lib012007b 01/05/2007 01/01/2008 01 lib012008 01/01/2008 NULL 02 Lib2 2007 01/01/2007 05/06/2007 02 Lib2 2007b 05/06/2007 NULL 03 LIB3 2007 01/01/2007 NULL 04 LIB3 2007 01/01/2007 15/03/2008
le EXISTS sert à ne pas mettre à jour les lignes qui ne changent pas dont la date de fermeture reste à NULL, il est utile car il y a des trigger sur update dans cette table.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Update PALIER SET DATE_FERMETURE= (SELECT MIN(F.DATE_OUVERTURE) from PALIER F where PALIER.CODE=F.CODE AND F.DATE_OUVERTURE>PALIER.DATE_OUVERTURE ) where DATE_FERMETURE is null AND EXISTS ( SELECT * from PALIER E WHERE E.CODE=PALIER.CODE AND E.DATE_OUVERTURE>PALIER.DATE_OUVERTURE );
Avez vous une autre façon d'écrire cette requête qui soit plus élégante et sans jointure triangulaire?
Ps : la requête doit fonctionner en SQL Server 2000 et 2005
Merci de votre aide
Soazig
Partager