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 :

Jointure externe + Restriction


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de _Xavier_
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2009
    Messages : 311
    Par défaut Jointure externe + Restriction
    J'ai une table dont le schéma est le suivant :
    Marges (week,year,marge)
    Et une table bi_week qui contient les numéros des semaines de l'année (1 à 53). Je dois réaliser qui me permettrai de comparer les marges de deux années successives pour le même numéro de semaine (2007/2008, 2008/2009, ...). Pour une année données on peut avoir des des semaines où il n y'a pas eu de ventes. L'objectif est d'afficher un résultat qui donne quelque chose comme :

    week year1 year2 marge1 marge2
    1 --- 2007 ------- 1
    2 --- 2007 ------- 1.2
    3 --- 2007 -2008 ---1.01 ---- 1
    4 --- ---- - 2008 --------- 0.98
    ...
    J'ai essayé avec cette requête mais le résultat n'est pas le bon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT	v1.marge AS marge1, 
    	v2.marge AS marge2,
    	v1.Year AS Year1,
    	v2.Year AS Year2,
    	v1.`week` AS week1
    FROM bi_week w 
    LEFT OUTER JOIN marges v1 on w.week = v1.week
    LEFT OUTER JOIN marges v2 ON w.week = v2.week
    AND v2.Year  = v1.Year  + 1

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Ce serait plutôt w.week dans votre select non ?

    Qu'est-ce qui ne convient pas exactement ?

  3. #3
    Membre très actif Avatar de _Xavier_
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2009
    Messages : 311
    Par défaut
    euh oui, c'est w.week. Merci pour la remarque.
    Qu'est-ce qui ne convient pas exactement ?
    Pour l'année 2007 mes ventes ne commencent qu'à partir de la 20 é semaine et pour 2008 depuis la première. A l'affichage (pour 2007/2008) je n'ai pas les ventes qui datent d'avant la 20 é semaine.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    En mettant w.week ça a du corriger votre problème.

  5. #5
    Membre très actif Avatar de _Xavier_
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2009
    Messages : 311
    Par défaut
    Citation Envoyé par CinePhil
    Mais si tu veux comparer les données des années successives sans les connaître à l'avance, ça risque de devenir vite compliqué comme structure de requête.
    C'est une solution que je suis en train d'étudier, si j'ai un choix plus optimal je n'hésiterai pas.

    Citation Envoyé par Waldar
    En mettant w.week ça a du corriger votre problème.
    Malheureusement non. La jointure ne marche qu'à gauche pour les années. Pour 2008/2009 j'ai les colonnes de 2009 qui sont à NULL pour les premières semaines.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Si vous pouviez nous fournir un petit jeu de données qui vous pose problème, ce serait parfait !

  7. #7
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Ce que tu cherches à faire est de la cosmétique.

    Si encore tu ne voulais comparer que deux années précises, tu pourrais joidre bi_week à deux sous requêtes retournant les données de Marges sur une année chacune :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT w.week, 
      m1.year AS year1, m1.marge AS marge1,
      m2.year AS year2, m2.marge AS marge2
    FROM bi_week AS w
    LEFT OUTER JOIN (
      SELECT week, year, marge
      FROM marges 
      WHERE year = 2007
    ) AS m1 ON w.week = m1.week
    LEFT OUTER (
      SELECT week, year, marge
      FROM marges 
      WHERE year = 2008
    ) AS m2 ON w.week = m2.week
    Mais si tu veux comparer les données des années successives sans les connaître à l'avance, ça risque de devenir vite compliqué comme structure de requête.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. Problème jointure externe et restriction where
    Par Cyrus59 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 10/09/2012, 17h45
  2. [CR9] faire une Jointure externe
    Par coldec dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 28/06/2005, 12h10
  3. Jointure externe qui ne fonctionne pas
    Par Guizz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/02/2004, 12h26
  4. [ jointure externe ] j'y pompe rien
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/12/2003, 17h57
  5. [Interbase] [Triggers] jointure externe
    Par AnestheziE dans le forum InterBase
    Réponses: 9
    Dernier message: 17/11/2003, 16h17

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