|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Nouveau Membre du Club
![]() |
bonjour à tous,
je me permet de vous soumettre un cas de jointure qui se révèle être un vrai casse tête. j'ai une table de fait (des facturations) qui de manière simplifiée se présente ainsi : sociéte / devise / client / chiffres_d_affaires / date_de_facture je cherche à faire une jointure sur une table devise : sociéte/ devise/date_de_debut/taux_de_change cette table contient les différents taux de change valable pour un intervalle de temps imprévisible (puisqu'il est possible à tous moment d'ajouter un taux de change pour une date donnée, ce taux sera valable à partir de la date en question, jusqu'à la date correspondant à l'enregistrement suivant) les enregistrements ont donc cet aspect : sociéte/ devise/date_de_debut/taux_de_change 001/USD/01-05-10/1.28 001/USD/05-06-10/1.27 001/USD/10-08-10/1.31 etc... mon objectif étant bien entendu de pouvoir rapprocher les factures des taux de change valables pour la date de facturation. merci de votre aide. |
|
|
00
|
|
|
#2 |
|
Membre émérite
![]() Tony Développeur .NET Inscription : novembre 2010 Messages : 570 ![]() |
Dans une sous requête cherches les dates inférieures à la date de la facture.
001/USD/01-05-10/1.28 001/USD/05-06-10/1.27 001/USD/10-08-10/1.31 facture du 08-06-10 tu élimines donc la dernière ligne Et pour avoir seulement le taux de change qui t'interesse, utilise la fonction MAX() dans ton select, tu élimines donc la première ligne et trouve la ligne qui t'intéresse
__________________
Le Porc est un loup pour le Porc. |
|
|
00
|
|
|
#3 | ||
|
Membre Expert
![]() Laure Consultante en Business Intelligence Inscription : avril 2007 Messages : 983 ![]() |
Bonjour,
Quel est ton SGBD ? Code :
__________________
~ Lola ~ Ne pas oublier : et aussi :
|
||
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Spécialiste en bases de données Inscription : septembre 2006 Messages : 2 884 ![]() |
Bonjour,
@ Lola Il y a quelque chose qui cloche : pour la paire {société, devise} votre requête produit nécessairement une ligne pour chaque chaque taux dont la date d'effet est < à la date de facture...
__________________
_ Faites simple, mais pas plus simple ! (A. Einstein) E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire ») => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale ») __________________ Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !) |
|
|
00
|
|
|
#5 | ||
|
Membre Expert
![]() Laure Consultante en Business Intelligence Inscription : avril 2007 Messages : 983 ![]() |
Effectivement, je me suis plantée
Je ne peux pas tester par contre, donc... Code :
__________________
~ Lola ~ Ne pas oublier : et aussi :
|
||
|
|
00
|
|
|
#6 |
![]() ![]() |
Évitez les recalculs à la volée.
D'un point de vue modélisation, la table devise est très bien comme cela. Il suffit de calculer la date de fin pour créer une période qui vous permettront une jointure avec un between. Si votre SBGD supporte les fonctions de fenêtrage, utilisez la fonction LEAD. Sinon, il faudra passer par le MIN des dates supérieures avec une autojointure.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#7 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
Le mieux serait de créer une vue. C'est fait pour cela !
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
10
|
|
|
#8 | ||||||||||||
|
Expert Confirmé Sénior
![]() ![]() ![]() Spécialiste en bases de données Inscription : septembre 2006 Messages : 2 884 ![]() |
Bonsoir Isildur,
Sur la base de votre exemple, effectuons un test en tenant compte des préconisations de Waldar. J'utilse ici SQL Server (voyez la fonction DATEADD qui sert ici à calculer J-1), adaptez s'il le faut en fonction de votre SGBD. Création des tables : Code SQL :
Un jeu d’essai : Code SQL :
Code SQL :
Afin que les requêtes ne soient pas trop hermétiques, on peut utiliser une vue pour représenter les dates d’effet des devises sous la forme intervallaire (date de début, date de fin). Comme dit Waldar, on passe par une auto-jointure (1er bloc de l’UNION), avec en plus la mise en œuvre d’un intervalle dont la fin soit suffisamment éloignée dans le temps pour prendre en compte le taux du jour (2e bloc de l’UNION) : Code SQL :
Recherche des taux pour les lignes de facturation, au moyen du BETWEEN préconisé par Waldar : Code SQL :
Au résultat : Code :
__________________
_ Faites simple, mais pas plus simple ! (A. Einstein) E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire ») => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale ») __________________ Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !) |
||||||||||||
|
|
00
|
|
|
#9 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Spécialiste en bases de données Inscription : septembre 2006 Messages : 2 884 ![]() |
Hello Fred,
Je n'avais pas vu votre message, mais je constate que nous avons eu le même réflexe
__________________
_ Faites simple, mais pas plus simple ! (A. Einstein) E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire ») => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale ») __________________ Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !) |
|
|
00
|
|
|
#10 | ||||||
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 417 ![]() |
Salut,
On est obligé de construire des intervalles ? Pour moi j'aurais dit que c'est la dernière date de cours inférieure ou égale à la date de facture... Sous Oracle, avec keep : Code :
Code :
Code :
- comme c'est une sous-requête scalaire, ça se comporte comme une jointure ouverte : j'ai un null qui ressort pour une facture antérieure au premier cours de sa devise - en général je suis pas très sous-requête scalaire parce que ça force le nl join ou filter... mais dans ce cas de toutes façons pas moyen de faire du hash avec des critères d'intervalle à mon avis.
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
||||||
|
00
|
|
|
#11 | |||||||
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 655 ![]() |
Citation:
Pourquoi donc ? (edit: en effet, il ne veut pas inclure les critère d'intervale dans le hash) Je ne peux pas tester sous Oracle, mais sous postegreSql par exemple : Code :
Code :
Code :
|
|||||||
|
|
00
|
|
|
#12 | ||||
![]() ![]() |
fsmrel, je pensais plutôt à ces vues qui sont équivalentes.
Fenêtrage Code :
Code :
__________________
Email : http://scr.im/waldar |
||||
|
00
|
|
|
#13 |
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 417 ![]() |
Bah en fait effectivement, la partie "=" des conditions peut être hashée, mais je pensais à la partie comparaison... en me disant qu'il y avait sûrement plein de cours pour une devise donnée. C'est ce qui me fait penser qu'un accès index sur (société, devise, datetaux) n'est pas une mauvaise solution...
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
|
00
|
|
|
#14 | |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
Citation:
En gros je leur met une table des taux de TVA avec les dates des différents changements (luxe, normale, réduit...) et je leur demande de calculer le total d'une facture avec des tables entête et détail facture... En bref ils n'y arrivent jamais ! A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
|
00
|
|
|
#15 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Spécialiste en bases de données Inscription : septembre 2006 Messages : 2 884 ![]() |
En tout cas, Isildur n'a plus que l'embarras du choix...
__________________
_ Faites simple, mais pas plus simple ! (A. Einstein) E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire ») => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale ») __________________ Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !) |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com