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

Requêtes MySQL Discussion :

VARIABLES et IF dans le SELECT


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 2
    Par défaut VARIABLES et IF dans le SELECT
    Bonjour,

    J'ai une table historiques qui comporte les champs suivants:
    - Date
    - Devise1
    - Devise2
    - Valeur

    Je voudrais sélectionner les historiques selon un couple de devises.
    Si la valeur du couple de devises n'existe pas, alors j'aimerais faire une division par deux autres couples de devises en cherchant une devise 'pivot'.
    Par exemple :
    Ma table contient tous les historiques
    Date_V|Devise1|Devise2|Valeur
    2008-05-01|EUR|USD|1.5000
    2008-05-01|EUR|JPY|100
    2008-05-01|EUR|CAD|2
    Je peux donc sélectionner les valeurs pour EUR/USD.
    En revanche, il faut que je divise la valeur de EUR/CAD par EUR/USD pour obtenir USD/CAD (l'EUR etant ma devise pivot).

    Il faudrait que ma requete fasse:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT Date_V, @d1:='USD', @d2:='CAD', @d3:='EUR', 
    IF(
    @val:=(SELECT valeur FROM historiques h1 WHERE Devise1=@d1 AND Devise2=@d2 AND h1.Date_V=h.Date_V), 
    @val, 
    ((SELECT valeur FROM historiques h2 WHERE Devise1=@d3 AND Devise2=@d2 AND h2.Date_V=h.Date_V))/((SELECT valeur FROM historiques h3 WHERE Devise1=@d3 AND Devise2=@d1 AND h3.Date_V=h.Date_V))
    ) as valeur
    FROM historiques
    WHERE Date_V='2008-05-01' GROUP BY Date_V

    Le probleme est que cela n'est pas fait correctement.
    Savez-vous comment je peux optimiser ma requete pour qu'il trouve automatiquement "@d3" et calcule la valeur ?

    Merci infiniment pour vos réponses !
    A bientot !

  2. #2
    Membre chevronné Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Par défaut
    J'avoue avoir beaucoup de mal à comprendre le problème :

    Citation Envoyé par cdil2008 Voir le message
    Je peux donc sélectionner les valeurs pour EUR/USD.
    Pourquoi peux-tu sélectionner les valeurs pours EUR/USD ?

    Citation Envoyé par cdil2008 Voir le message
    En revanche, il faut que je divise la valeur de EUR/CAD par EUR/USD pour obtenir USD/CAD (l'EUR etant ma devise pivot).
    Pourquoi diviser les valeur EUR/CAD par EUR/USD ?

  3. #3
    Nouveau candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 2
    Par défaut
    Salut!

    En fait, je peux sélectionner directement l'EUR/USD car sa valeur se trouve directement dans la table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM historiques WHERE d1='EUR' et d2='USD'
    Ce qui me retourne 1.5000

    En revanche, pour l'USD/CAD, je ne peux pas le faire directement car cette valeur n'existe pas dans la table.
    Il faut alors que je la calcule en divisant le cours de chaque devise contre une autre qu'on appelle pivot (dans ce cas, l'EUR) selon la definition financiere.

    Donc en gros, je voudrais que ma requete me retourne directement le tableau suivant :

    Date_V | Devise1 | Devise2 | DevisePivot | Valeur
    2008-05-01 | EUR | USD | null | 1.5000
    2008-05-01 | USD | CAD | EUR | 1.3333 <- Resultat de la division (2/1.5000)
    En testant si la valeur existe directement et si elle n'existe pas, alors passer par une devise pivot.

    Si tu as d'autres questions n'hesite pas

    Merci beaucoup !!!!

  4. #4
    Membre chevronné Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Par défaut
    Essaye cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT 
       IF(devise1 == 'EUR' && devise2 == 'USD', 'EUR', 'USD'),
       devise2,
       IF(devise1 == 'EUR' && devise2 == 'USD', null, 'EUR'),
       IF(devise1 == 'EUR' && devise2 == 'USD', valeur, valeur/pivot.valeur)
    FROM historique,
     (SELECT valeur FROM historiques WHERE d1='EUR' et d2='USD') AS pivot

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 955
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 955
    Par défaut
    Salut,

    A mon avis le problème n'est pas de tester les valeurs pour créer ton pivot, mais le problème est que la ligne USD|CAD n'existe pas (USD n'est pas une devise1).
    Je te propose donc une requête en 2 parties :
    1) D'abord tu selectionnes les lignes de ta table.
    2) tu y ajoutes des données générées en joignant ta table à elle même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    select Date_V,Devise1,Devise2,
    		NULL as Pivot,
    		Valeur
    from historiques
    UNION ALL
    select h1.Date_V,h1.Devise2 as Devise1,h2.Devise2,
    		'EUR' as Pivot,
    		h2.Valeur/h1.Valeur as Valeur
    from historiques h1
    inner join historiques h2
    	on (h1.Date_v=h2.Date_v and h1.devise2 != h2.devise2)
    order by Date_v,Devise1,Devise2
    Perso je vois que ça, compte tenu de l'exemple fourni, mais il y a peut être plus simple quand même.

Discussions similaires

  1. PL/SQL Variable dans un SELECT
    Par lolo-d dans le forum PL/SQL
    Réponses: 1
    Dernier message: 04/12/2006, 09h17
  2. [PL/SQL] utilisation de variables dans un select?
    Par Dr Kraft dans le forum SQL
    Réponses: 8
    Dernier message: 11/10/2006, 11h17
  3. pb : VIEW avec variable dans le select
    Par seb.briet dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 13/05/2006, 02h57
  4. récupérer une variable dans un select case
    Par rob2-9 dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 23/12/2005, 11h54
  5. Pl/SQL utilisation d'une variable dans un select
    Par larg dans le forum PL/SQL
    Réponses: 17
    Dernier message: 30/11/2004, 18h08

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