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

  1. #1
    Membre à l'essai
    Itération : récupérer la valeur d'une ligne après avoir lu la suivante
    bonjour

    Je dois récupérer le taux de change qui était en vigueur quand ma commande a été saisie.
    Comme le fichier des taux de change ne comporte qu'une date (correspondant à à partir de ) je ne sais pas comment m'y prendre pour la récupérer.
    Comme on peut appliquer un nouveau taux en cours d'année je dois systématiquement tester la date de la commande et la date du taux de change en entier, et pas seulement l'année comme j'avais commencé à le faire.
    Ex.

    Quand je lis la table des taux de change, il faut que la date de ma commande soit >= à la date du taux et < la date suivante
    ex. (date) 20080901 (taux) 1.30
    ex. (date) 20180901 (taux) 1.18

    -> si ma commande a été saisie le 01/01/2015 je voudrais récupérer 1.30
    -> si ma commande a été saisie le 01/09/2018 je voudrais récupérer 1.18

    J'ai cru comprendre que les curseurs permettent de faire ça mais je ne sais pas vraiment les utiliser.

    Merci de votre aide

  2. #2
    Expert éminent sénior
    Un exemple à l’arrache et à simplifier, en utilisant une CTE (common table expression)

    create table TAUX
    (
            tauxId      int            not null
          , tauxType    varchar(8)     not null
          , tauxValeur  decimal (7,6)  not null
          , tauxDate    date           not null
        , constraint taux_pk primary key (tauxId)  
        , constraint taux_ak unique  (tauxType, tauxDate)    
    ) ;
    insert into Taux (tauxId, tauxType, tauxValeur, tauxDate)
    values
        (11, 'usd', 1.130960, '1999-09-01')
      , (12, 'usd', 1.100000, '2004-09-01')
      , (13, 'usd', 1.200000, '2006-09-01')
      , (14, 'usd', 1.300000, '2008-09-01')
      , (15, 'usd', 1.180000, '2018-09-01')
      , (16, 'usd', 1.170000, '2020-01-01')
      , (21, 'eur', 1.130960, '1999-09-01')
      , (22, 'eur', 1.100000, '2004-09-01')
      , (23, 'eur', 1.200000, '2006-09-01')
      , (24, 'eur', 1.300000, '2008-09-01')
      , (25, 'eur', 1.180000, '2018-09-01')
      , (26, 'eur', 1.170000, '2020-01-01')
    


    Unité = 'usd', date de commande = '2015-01-01'

     
    with t1 as (select max(tauxDate) as dateInf from TAUX where tauxDate <= '2015-01-01' and tauxType = 'usd')
    ,    t2 as (select min(tauxDate) as dateSup from TAUX where tauxDate  > '2015-01-01' and tauxType = 'usd')
    ,    t3 as ( select dateInf, dateSup, 'usd' as tauxType from t1, t2)
    select tauxValeur from TAUX as x join t3 as y on x.tauxType = y.tauxType 
    where x.tauxType = 'usd' and x.tauxDate >= y.dateInf and (x.tauxDate < y.dateSup or y.dateSup is Null) 
    ; 


    =>

    tauxValeur
    1.300000
    
    Le test de Null c’est pour les dates de commandes >= dernière date de taux connue.
    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 »)

    Je ne réponds pas aux questions techniques par MP. Les forums sont là pout ça.
    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench

  3. #3
    Modérateur

    Si votre version de SQL Server le permet, vous pouvez utiliser la fonction LEAD pour ligne la ligne d'après, ensuite c'est une simple jointure between.

###raw>template_hook.ano_emploi###