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 sans clé


Sujet :

Langage SQL

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    124
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 124
    Par défaut Jointure sans clé
    Bonjour,

    J'ai une table du style (avec plusieurs clients évidemment) :

    Client mois CA
    A 201801 40
    A 201803 50


    Et j'aimerais avoir :

    Client mois CA
    A 201801 40
    A 201802 0
    A 201803 50


    J'ai préparé une table contenant tous les mois de 201701 à 201805 et je voudrais faire une jointure entre les 2.
    Mais je n'arrive pas à tourver le bon type de jointure.

    Merci pour votre aide !

  2. #2
    Membre émérite Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Par défaut
    Bonjour,

    Voici une idée, testée sur MSSQL :

    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
     
    with t(client, mois, ca) as (
    	select 'A', '201801', 40 union all
    	select 'A', '201803', 50 union all
    	select 'B', '201802', 10 union all
    	select 'B', '201804', 23
    ), mois(m) as (
    	select '201801' union all
    	select '201802' union all
    	select '201803' union all
    	select '201804' union all
    	select '201805'
    )
    select td.client, td.m, COALESCE(t.ca, 0) AS ca
    from t
    	right join (
    		select distinct client, m
    		from t
    			cross join mois
    	) AS td
    		on td.m = t.mois
    		and td.client = t.client
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    client m      ca
    ------ ------ -----------
    A      201801 40
    A      201802 0
    A      201803 50
    A      201804 0
    A      201805 0
    B      201801 0
    B      201802 10
    B      201803 0
    B      201804 23
    B      201805 0
    En français :
    Je construis une table dérivée (une sous-requête) que j'ai nommée "td"; c'est un produit cartésien (cross join) entre les clients et les mois, ce qui me donne toutes les combinaisons possibles.
    Ensuite je fais une jointure externe entre cette table dérivée et les données de la table principale, COALESCE permet de remplacer les NULL par des 0.

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    124
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 124
    Par défaut
    Merci beaucoup Oishiii !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Jointure sans clé etrangere
    Par brajae85 dans le forum SQL
    Réponses: 4
    Dernier message: 22/02/2010, 05h04
  2. [MySQL] [Doctrine] Jointure sans relation
    Par Cladjidane dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/09/2009, 07h41
  3. Innodb Jointure sans LEFT JOIN
    Par mokadjo dans le forum Requêtes
    Réponses: 6
    Dernier message: 15/04/2009, 17h50
  4. Jointure sans tenir compte de la casse
    Par Elise49 dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 05/03/2009, 12h33
  5. Jointure sans le produit
    Par defcon_suny dans le forum Langage SQL
    Réponses: 9
    Dernier message: 11/07/2008, 09h55

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