IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

[Oracle] Sommer des montants de devises différentes


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 123
    Points : 84
    Points
    84
    Par défaut [Oracle] Sommer des montants de devises différentes
    Bonjour à tous,
    Débutant en SQL, j'ai une requête à effectuer et je ne sais pas comment m'y prendre.
    Alors pour simplifier, j'ai deux tables.
    Une table des devises:

    | Devise | Taux de change |
    ---------------------------
    |EUR | 1 |
    ---------------------------
    |USD |78 |
    ---------------------------
    |JPY |66 |
    ---------------------------
    etc.
    Et une table de commandes clients:

    | NumCde| Devise | Montant |
    -----------------------------
    |001 | EUR |52 |
    -----------------------------
    |002 | JPY |365 |
    -----------------------------
    |003 | JPY |497 |
    -----------------------------
    |004 | USD |82 |
    -----------------------------
    |001 | USD |38 |
    -----------------------------
    etc.
    Je dois sommer les montants de commande, et obtenir un total en euros. Je dois donc convertir chaque montant en euros, en fonction de sa devise.
    Quelle est la meilleure façon de s'y prendre, sachant que je travaille sous Oracle?

  2. #2
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Je suppose que le schéma ci-dessous devrait marcher. NB : Ce n'est qu'un schéma : noms de tables et de champs à préciser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT SUM (TBDevises.Taux*TbCommandes.Montant)
    FROM TBDEVISES
    JOIN TBCOMMANDES
    ON TBCommandes. DEVISE = TBDevises .Devise)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 123
    Points : 84
    Points
    84
    Par défaut
    Super, merci!
    Je complique un peu la chose:
    Ma table des commandes comprend une date de création de la commande, et la table des devises une date de début de validité de la devise.
    Toute évolution du taux de change est matérialisée par un nouvel enregistrement avec une date de début de la validité de ce nouveau taux de change. Le montant en euros d'une commande dépend donc également du taux de conversion au moment de sa création!
    Personnellement, je ne trouve là encore pas comment m'y prendre.
    Une idée?

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut Date fin validité
    Si on peut ajouter pour chaque devise une date de fin de validité dans la table des devises, tout devient plus simple.

    Nouvelle requête :

    Select a.NumCde, Sum(a.Montant * b.TauxDeChange)
    From CommandeClient a Join Devises b
    On a.Devise = b.Devise
    And a.DateCommande between b.DateDebValid and b.DateFinValid
    Group By a.NumCde

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 123
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par Mercure
    Si on peut ajouter pour chaque devise une date de fin de validité dans la table des devises (...)
    Ce n'est pas le cas!!

  6. #6
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Mercue a raison, ç'aurait été la meilleure solution.
    Sinon, je vois deux pistes :
    - une vue (si Oracle les admet) qui intégrerait ce fameux champ FinValidite
    - ou une sous-requête (si Oracle les admet).
    Ce qui me gêne un peu, c'est que si tu coinçais sur la 1ère requête, tu vas avoir du mal avec celle-ci. Faut penser à étudier le SQL avant d'aller plus loin . Ca n'est pas très long pour acquérir la connaissance des techniques de base - pour apprendre à les appliquer intelligemment, c'est évidemment autre chose, faut mouiller la chemise

    En ce qui concerne la sous-requête :
    La requête pour identifier l'enregistrement de TbDevises qui t'intéresse est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT MAX (TBDevises.DateValidite) 
    FROM TbDevises 
    JOIN TbCommandes ON TBCommandes. DEVISE = TBDevises .Devise)
    WHERE (TBDevises.DateValidite <= TbCommande.DateCommande)
    qu'il faut ensuite intégrer dans ta requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT SUM (TBDevises.Taux*TbCommandes.Montant) 
    FROM TbCommandes 
    JOIN TbDevises
      ON (TBDevises .Devise = TBCommandes. Devise)
      AND (TbDevises .Datevalidite 
        = (SELECT MAX (TBDevises.DateValidite) 
         FROM TbDevises 
         WHERE ON (TBDevises .Devise = TBCommandes. Devise)
         AND (TBDevises.DateValidite <= TbCommande.DateCommande)))
    De nouveau, c'est un schéma, à tester et affiner.

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut ça doit marcher
    Ben53,

    rsc nous donne ici un bel exemple futé de sous-requête imbriquée qui devrait te satisfaire.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 123
    Points : 84
    Points
    84
    Par défaut
    A vrai dire, je connais le SQL, mais je n'en fais qu'avec MySQL sur des bases pas bien compliquées... L'idée, c'était plus de savoir quelle était la façon la plus élégante sur un langage SQL fonctionnellement plus riche. En tout cas merci beaucoup!

Discussions similaires

  1. requete oracle pour obtenir des montant sur 12 mois glissant
    Par gueulederack dans le forum Oracle
    Réponses: 7
    Dernier message: 16/06/2011, 15h06
  2. [Oracle 8i]Sommer des temps
    Par venusiafalls dans le forum Oracle
    Réponses: 15
    Dernier message: 19/07/2005, 10h09
  3. Réponses: 3
    Dernier message: 13/12/2004, 13h54
  4. [Fonction Oracle] Convertir des secondes en heure
    Par falcon dans le forum Oracle
    Réponses: 12
    Dernier message: 18/11/2004, 11h56
  5. DBExpress et Oracle Recupération des params de TSQLDataSet
    Par ThierryD dans le forum Bases de données
    Réponses: 2
    Dernier message: 10/06/2004, 19h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo