|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre à l'essai
![]() Inscription : février 2011 Messages : 60 ![]() |
Bonjour,
J'ai une table sous sql server sous cette forme: code DEBTF FINTF DEBRD FINRD DEBRP FINRP DEBTX FINTX 111 2008-04-17 2008-07-01 2008-03-04 2008-06-30 2008-12-07 2009-01-04 2009-01-01 9999-12-31 Je souhaite avoir chaque fois la date la plus proche à la première colonne (DEBTF ) et qui est inférieure à la 2ème colonne ( FINTF).Si je traiterai cas par cas en comparant chaque fois les dates,je risque de ne pas prendre toutes les possibilités. j'ai pensé à faire une procédure de tri sur les dates entre DEBTF et FINTF puisque à chaque fois je l'aurai besoin. j'espère que mon problème est clair. Merci d'avance pour des suggestions.Si c'est possible avec une tel procédure comment l'a définir. |
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() Développeur java, access, sql server Inscription : octobre 2005 Messages : 851 ![]() |
Piste à suivre :
Code :
1) on empile ta table en 6 requêtes pour mettre toutes les dates à comparer dans la même colonne 2) on en profite pour éliminer les dates qui ne seraient pas < FINTF 3) NbJours est le nombre de jours séparant DateTest de DEBTF ce qui fait qu'il sera facile de trouver le minimum.
__________________
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser. First, make it work. Then, make it fast. Finally, make it user-friendly. Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich. |
||
|
|
00
|
|
|
#3 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 667 ![]() |
Bonjour,
Vous avez d'autres solutions : - créer une fonction prenant en paramètre les 6 dates et extrayant la date la qui convient, et l'utiliser pour en faire une colonne calculée, éventuellement indexée - Créer une vue indexée remplissant le même besoin - Créer un trigger INSTEAD OF INSERT, UPDATE qui value une colonne supplémentaire pour vous. Moins performant ... - Changer la conception de votre table en créant à la place une table qui stocke pour chaque code toutes les dates. Cette table référencerait les 8 types de dates que vous stockez. On aurait donc une table dont les colonnes seraient code, type_date, date. La requête s'écrit alors très simplement en utilisant MIN, GROUP BY et HAVING. Je pense que la dernière solution est, avec une bonne indexation, la meilleure en terme de conception et de performances @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
00
|
|
|
#4 | |
|
Membre à l'essai
![]() Inscription : février 2011 Messages : 60 ![]() |
Bonjour à tous,
Merci pour vos suggestions. Je choisis cette solution : Citation:
Mais j'ai pas bien compris comment je ferai l'extraction de la date et la colonne à créer.Pouvez vous m'expliquez de plus. Merci. |
|
|
|
00
|
|
|
#5 | |||||||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 667 ![]() |
Donc voici la fonction :
Code :
Ensuite je me suis créé la table suivante : Code :
Code :
Code :
INSERT dbo.test VALUES (111, '2008-04-17', '2008-07-01', '2008-03-04', '2008-06-30', '2008-12-07', '2009-01-04', '2009-01-01', '9999-12-31') Qui donne : Citation:
@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|||||||
|
00
|
|
|
#6 |
|
Membre à l'essai
![]() Inscription : février 2011 Messages : 60 ![]() |
Bonjour,
Merci ça bien marché. ![]() Comment rendre cette fonction retournant Min et @DEBTF Le fait d'ajouter un champ dans le select me pause le problème suivant: Code :
Only one expression can be specified IN the SELECT list when the subquery IS NOT introduced WITH EXISTS. |
|
|
00
|
|
|
#7 | ||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 667 ![]() |
C'est normal puisque nous avons écrit :
La fonction est donc une fonction scalaire, et ne retourne donc qu'une valeur (pas une table !). Si vous voulez ajouter une colonne, vous devez modifier la fonction pour qu'elle fasse cela : Code :
Vous pourrez en revanche l'utiliser avec l'opérateur APPLY. SI vous ne voulez retourner que les lignes pour lesquelles la fonction retourne une valeur, utilisez CROSS APPLY. Si en revanche vous voulez les deux colonnes retournées par APPLY, qu'il existe un résultat ou non (les deux colonnes de la fonction sont donc à NULL), utiliser OUTER APPLY. Si vous ne voyez pas comment écrire une telle requête, donnez votre requête actuelle (ou son squelette) et ce que vous souhaitez obtenir en sortie. @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
||
|
00
|
|
|
#8 |
|
Membre à l'essai
![]() Inscription : février 2011 Messages : 60 ![]() |
Bonjour,
Merci bien, j'ai pris info de ces deux lien sur l'intra jointure Apply: http://blog.developpez.com/sqlpro/p9...ointure-apply/ http://technet.microsoft.com/fr-fr/l...6(SQL.90).aspx
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com