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

SQL Oracle Discussion :

Problème de date dans un intervalle


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 19
    Par défaut Problème de date dans un intervalle
    Bonjour,

    Je sollicite votre aide sur un problème où je ne sais plus quoi faire.

    Je possède 2 tables :

    Exemple tableA pour 1 client:
    NUM_CLI : 3588965
    ANN_MOI : 200301,200305,200310
    COEFF : 200,180,195

    Explication :
    de 200301 à 200304 COEFF = 200
    de 200305 à 200309 COEFF = 180
    de 200310 à sysdate COEFF = 195

    Exemple tableB pour 1 client:
    NUM_CLI : 3588965
    ANN_MOI : 200305
    CA : 10000

    Il faudrait que je calcul par client le CA/COEFF selon le ANN_MOI.
    Dans la table B je suis en 200305. Le COEFF est donc de 200 car
    200304 <= 200305<200305

    Mais comment je peux traduire ça en SQL?
    Si les 2 extrème des dates je peux traduire par MIN(ANN_MOI) et MAX(ANN_MOI),
    comment je fais pour les valeurs au centre?

    Voilà le début de ma requête:

    select CA/COEFF
    from tableA,tableB
    where tableA.NUM_CLI = tableB.NUM_CLI
    AND ???

    Merci de vote aide.

  2. #2
    Scorpi0
    Invité(e)
    Par défaut
    Pas bien compris ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Exemple tableA pour 1 client:
    NUM_CLI : 3588965
    ANN_MOI : 200301,200305,200310
    COEFF : 200,180,195
    Tu as 3 lignes dans la table pour 1 client ?
    genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    NUM_CLI     ANN_MOI    COEFF  
    3588965     200301       200
    3588965     200305       180
    3588965     200310       195
    Et à partir de ça tu dois déterminer pour une date donnée quel est le coeff à appliquer ?

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    peut-être avec KEEP ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select tableB.num_cli,tableB.ca, 
      min(tableA.coeff) keep (dense_rank last order by tablea.ann_moi) coeff 
    from tableA,tableB
    where tableA.NUM_CLI = tableB.NUM_CLI
    and tableA.ann_moi<=tableB.ann_moi

  4. #4
    Membre expérimenté Avatar de DAB.cz
    Inscrit en
    Octobre 2006
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 221
    Par défaut
    ou peut-être:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    create table tablea (
      num_cli number,
      ann_moi number,
      coeff number);
    insert into tablea (num_cli, ann_moi, coeff) values (3588965, 200301, 200);
    insert into tablea (num_cli, ann_moi, coeff) values (3588965, 200305, 180);
    insert into tablea (num_cli, ann_moi, coeff) values (3588965, 200310, 195);
    insert into tablea (num_cli, ann_moi, coeff) values (3589000, 200308, 100);
     
    create table tableb (
      num_cli number,
      ann_moi number,
      ca number);
    insert into tableb (num_cli, ann_moi, ca) values (3588965, 200301, 10000);
    insert into tableb (num_cli, ann_moi, ca) values (3588965, 200302, 10000);
    insert into tableb (num_cli, ann_moi, ca) values (3588965, 200303, 10000);
    insert into tableb (num_cli, ann_moi, ca) values (3588965, 200304, 10000);
    insert into tableb (num_cli, ann_moi, ca) values (3588965, 200305, 10000);
    insert into tableb (num_cli, ann_moi, ca) values (3588965, 200306, 10000);
    insert into tableb (num_cli, ann_moi, ca) values (3588965, 200307, 10000);
    insert into tableb (num_cli, ann_moi, ca) values (3588965, 200308, 10000);
    insert into tableb (num_cli, ann_moi, ca) values (3588965, 200309, 10000);
    insert into tableb (num_cli, ann_moi, ca) values (3588965, 200310, 10000);
    insert into tableb (num_cli, ann_moi, ca) values (3588965, 200311, 10000);
    insert into tableb (num_cli, ann_moi, ca) values (3589000, 200308, 500);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select num_cli, moi, min (c) coeff, min (ca) / min (c) x
      from (
        SELECT tableB.num_cli,tableB.ca, tableB.ann_moi moi, tableA.coeff, tableA.ann_moi A,
            first_value (coeff) over (partition by tableB.num_cli, tableB.ann_moi order by tableB.ann_moi desc, tableA.ann_moi desc) c
          FROM tableA,tableB
          WHERE tableA.NUM_CLI = tableB.NUM_CLI
          AND tableA.ann_moi <= tableB.ann_moi)
      group by num_cli, moi
      order by num_cli, moi;
    le résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      NUM_CLI       MOI     COEFF         X
    --------- --------- --------- ---------
      3588965    200301       200        50
      3588965    200302       200        50
      3588965    200303       200        50
      3588965    200304       200        50
      3588965    200305       180 55,555556
      3588965    200306       180 55,555556
      3588965    200307       180 55,555556
      3588965    200308       180 55,555556
      3588965    200309       180 55,555556
      3588965    200310       195 51,282051
      3588965    200311       195 51,282051
      3589000    200308       100         5
    Mais je ne comprends pas (entre autres) ça:
    Dans la table B je suis en 200305. Le COEFF est donc de 200 car
    200304 <= 200305<200305

Discussions similaires

  1. [CR10] Problème de date dans l'en-tête de groupe
    Par bernie.noel dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 17/08/2005, 00h48
  2. problème champ date dans base oracle
    Par ludovik dans le forum Oracle
    Réponses: 6
    Dernier message: 25/07/2005, 15h48
  3. Problème de date dans fonction utlisateur
    Par lutin2003 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/04/2005, 16h25
  4. Problème de date dans requête de màj imbriquée
    Par VirginieGE dans le forum Langage SQL
    Réponses: 11
    Dernier message: 20/07/2004, 15h34
  5. Problème de date dans MONTHS_BETWEEN
    Par ghostlord79 dans le forum Oracle
    Réponses: 10
    Dernier message: 07/04/2004, 11h21

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