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 :

[SQL Server] "Jointure" avec histo inexistant


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2003
    Messages : 182
    Points : 110
    Points
    110
    Par défaut [SQL Server] "Jointure" avec histo inexistant
    Bonjour à tous,

    je dois effectuer une requête qui affiche le prix par mois d'une liste de produit. Cependant si sur un mois donné on ne trouve pas de prix, il faut récupérer le dernier prix connu.

    Je pense faire dans un premier temps un select pour tout récupérer puis utiliser un curseur pour vérifier que chaque produit a bien un prix par mois (si pas le cas, récupérer le plus récent) et ajouter les lignes manquantes.

    Pensez vous qu'il y ait plus simple ?

    Merci d'avance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT    produit, prix_annee, prix_mois,    
    FROM         V_PRODUIT_PRIX, V_PRODUIT_ACHAT 
    WHERE       V_PRODUIT_PRIX.idprod= PRODUIT_ACHAT.idprod
    AND       (V_PRODUIT_PRIX.frs_agree = 'PUMP')
    ORDER BY prix_annee, prix_mois
     
    /* AJOUT BOUCLE AVEC CURSEUR */
    ....
    Ce n'est pas parce qu'ils sont beaucoup a avoir tort qu'ils ont raison.

  2. #2
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Bonjour,

    Merci de respecter les CONSEILS... à lire AVANT de POSTER, préciser votre SGBD ainsi qu'un minimum d'information sur votre schéma seraient utiles pour vous répondre de manière pertinente,
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2003
    Messages : 182
    Points : 110
    Points
    110
    Par défaut
    Désolé;

    Alors je suis sous SQL SERVER 2000, pour cette requette j'utilise deux tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    T_PRODUIT_ACHAT: (table d'info sur les produits)
    -idprod
    -nomprod
    -infoprod
    T_PRODUIT_PRIX (contient un prix par produit, par mois, par année si le produit a été commandé le mois en question)
    -idprod
    -mm_prix (mois)
    _aa_prix (année)
    Par T_produit_achat je récupére tous les produits en stock, ensuite, je cherche les différents prix pour le produit dans la table T_PRODUIT_PRIX en passant par 'idprod', par années et par mois. Hors certains produits ne sont pas commandées tous mois donc actuellement avec ma requette je recupére par exemple :

    idprod année mois prix
    idprod 1 : 2006 01 10€
    idprod 1 : 2006 02 11€
    idprod 1 : 2006 03 9€
    idprod 1 : 2006 04 10€
    idprod 1 : 2006 06 13€

    Mon problème est que si il me manque le prix pour un mois, il faut prendre le dernier prix connu. Donc hormis un curseur, je ne vois pas trop comment faire.

    Voilà, j'espère avoir été un peu plus clair
    Ce n'est pas parce qu'ils sont beaucoup a avoir tort qu'ils ont raison.

  4. #4
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Salut,

    oui, c'est plus clair, à ceci près qu'il te manque le champ "prix" dans la table T_PRODUIT_PRIX, non ?

    Connais-tu cet article de SQLPro : Le temps, sa mesure, ses calculs ?

    En résumé, il explique que pour faire des jointures avec des données temporelles, il est souvent utiles de les gérer physiquement dans la BDD.

    Ici, si tu avais une telle table, ta requête serait plus facile à gérer

    Je bricole un exemple et je reviens,
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  5. #5
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Bon, mon exemple n'est pas tout à fait terminé, je te le livre tel quel puisque j'ai du taf ...

    je créée 3 tables, les 2 tiennes et mes périodes :
    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
    -- Produits en stock :
    CREATE TABLE T_PRODUIT_ACHAT (
    idprod NUMBER (2),
    nomprod VARCHAR2 (16) );
     
    -- Histo prix produits :
    CREATE TABLE T_PRODUIT_PRIX  (
    idprod NUMBER (2),
    mm_prix NUMBER (2),
    aa_prix NUMBER (4),
    prix NUMBER (4) );
     
    -- table des mois/années :
    CREATE TABLE T_PERIODE (
    mois NUMBER (2),
    annee NUMBER (4) );
    Je les remplis ...
    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
    -- 1 produit suffira :
    INSERT INTO T_PRODUIT_ACHAT VALUES (1, 'Marteau');
     
    -- 7 histo de prix : 
    INSERT INTO T_PRODUIT_PRIX VALUES (1, 11, 2005, 07);
    INSERT INTO T_PRODUIT_PRIX VALUES (1, 12, 2005, 08);
    INSERT INTO T_PRODUIT_PRIX VALUES (1, 01, 2006, 10);
    INSERT INTO T_PRODUIT_PRIX VALUES (1, 02, 2006, 11);
    INSERT INTO T_PRODUIT_PRIX VALUES (1, 03, 2006, 09);
    INSERT INTO T_PRODUIT_PRIX VALUES (1, 04, 2006, 10);
    -- rien en mai 2006 !
    INSERT INTO T_PRODUIT_PRIX VALUES (1, 06, 2006, 13);
     
    -- Et TOUTES les périodes qui t'intéressent :
    INSERT INTO T_PERIODE VALUES (11, 2005);
    INSERT INTO T_PERIODE VALUES (12, 2005);
    INSERT INTO T_PERIODE VALUES (01, 2006);
    INSERT INTO T_PERIODE VALUES (02, 2006);
    INSERT INTO T_PERIODE VALUES (03, 2006);
    INSERT INTO T_PERIODE VALUES (04, 2006);
    INSERT INTO T_PERIODE VALUES (05, 2006);
    INSERT INTO T_PERIODE VALUES (06, 2006);
     
    COMMIT;
    La requête suivante te ramènera tes 8 lignes, avec un prix non renseigné pour Mai :
    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
    SQL> SELECT prix, P.annee, P.mois
      2    FROM T_PRODUIT_PRIX PP
      3        RIGHT OUTER JOIN T_PERIODE P
      4     ON (PP.mm_prix = P.mois AND PP.aa_prix = P.annee)
      5   WHERE PP.idprod = 1 OR PP.idprod IS NULL
      6   ORDER BY annee, mois;
     
          PRIX      ANNEE       MOIS
    ---------- ---------- ----------
             7       2005         11
             8       2005         12
            10       2006          1
            11       2006          2
             9       2006          3
            10       2006          4
                     2006          5
            13       2006          6
     
    8 ligne(s) sélectionnée(s).
    le reste n'est plus que du formattage de données, il te suffit de prendre le dernier prix renseigné précédemment.

    Il espossible de le caculer via une sous-requête, sur le dernier histo où il est non NULL, mais je n'ai plus de temps, désolé ...
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/05/2006, 19h01
  2. [SQL server 2000] jointures de 3 tables
    Par batosai dans le forum Langage SQL
    Réponses: 3
    Dernier message: 28/04/2006, 09h45
  3. [SQL-Server] ms sql server et php : problème avec les caractères accentués
    Par stephane9422 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 05/12/2005, 17h45

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