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 contrainte de clé


Sujet :

Langage SQL

  1. #1
    Invité
    Invité(e)
    Par défaut Jointure sans contrainte de clé
    Bonjour,

    J'avais posté initialement sur la partie PHP pour un problème de boucle entre 2 requêtes SQL. Mais il semblerait que le problème peut être réglé avec du SQL tout simplement !

    J'ai 2 requêtes SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT annee, COALESCE(SUM(abonnement),0) + COALESCE(SUM(consommation),0) + COALESCE(SUM(autres),0) - COALESCE(SUM(remise),0) as total_general_fixe 
    FROM TEL_FIXE_ANALYSE 
    GROUP BY annee 
    ORDER BY annee
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT annee, COALESCE(SUM(abonnement),0) + COALESCE(SUM(consommation),0) + COALESCE(SUM(autres),0) - COALESCE(SUM(remise),0) as total_general_mobile 
    FROM TEL_MOBILE_ANALYSE 
    GROUP BY annee 
    ORDER BY annee
    J'ai tenté de faire une jointure sur l'année car elles sont identiques mais je n'ai aucun lien avec ces 2 requêtes SQL.

    ça donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT F.annee, COALESCE( SUM( F.abonnement ) , 0 ) + COALESCE( SUM( F.consommation ) , 0 ) + COALESCE( SUM( F.autres ) , 0 ) - COALESCE( SUM( F.remise ) , 0 ) AS total_general_fixe, COALESCE( SUM( M.abonnement ) , 0 ) + COALESCE( SUM( M.consommation ) , 0 ) + COALESCE( SUM( M.autres ) , 0 ) - COALESCE( SUM( M.remise ) , 0 ) AS total_general_mobile
    FROM TEL_FIXE_ANALYSE F, TEL_MOBILE_ANALYSE M
    WHERE F.annee = M.annee
    GROUP BY F.annee
    ORDER BY F.annee
    Et ça ne fonctionne pas... les résultats sont complètements faux !

    Merci pour votre aide.
    Dernière modification par ced ; 28/01/2014 à 17h21. Motif: Lisibilité des requêtes

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Bonjour,
    Je pense que si tu enlèves les agrégations de la requête, tu vas voir tout de suite pourquoi les résultats sont faux...
    A mon avis le mieux ici est de faire une jointure entre les deux requêtes, et non les deux tables.

    Tatayo.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Voilà ce que propose tatayo
    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
    SELECT Annee, total_general_fixe,total_general_mobile
    FROM
    	(SELECT annee, COALESCE(SUM(abonnement),0) + COALESCE(SUM(consommation),0) + COALESCE(SUM(autres),0) - COALESCE(SUM(remise),0) AS total_general_fixe 
    	FROM TEL_FIXE_ANALYSE 
    	GROUP BY annee 
    	ORDER BY annee
    	) AS F
    inner join
    	(
    SELECT annee, COALESCE(SUM(abonnement),0) + COALESCE(SUM(consommation),0) + COALESCE(SUM(autres),0) - COALESCE(SUM(remise),0) AS total_general_mobile 
    FROM TEL_MOBILE_ANALYSE 
    GROUP BY annee 
    ORDER BY annee
    )  AS M
    on F.ANNEE=M.ANNEE
    Cela dit j'ai l'impression qu'il y a un problème de modélisation la dessous,
    les tables TEL_MOBILE_ANALYSE , et TEL_FIXE_ANALYSE se ressemblent furieusement. J'aurais personnellement tout mis dans la même table avec un type_telephone indiquant mobile ou fixe.

    A+
    Soazig

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Merci pour vos réponses.

    Effectivement, la modélisation pour ces 2 tables n'a pas forcément été bien pensé à la base.
    Elles sont identiques mais séparé complètement... Le Type aurait pu être une idée, je l'ai fais sur d'autres tables mais pas ces 2 là et j'avoue ne pas du tout me souvenir pourquoi...

    Comme je l'ai dis, le problème pouvait être réglé en MYSQL alors qu'à la base, je cherchais de l'aide sur les forums PHP. On me propose aussi de faire un UNION ?
    Au niveau purement SQL, le INNER JOIN que vous proposez est plus efficace ?

    En vous remerciant.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Ah non mais j'ai compris...

    En fait, le but final était de les additionner directement en SQL et pour cela, il fallait créer un lien...
    Voilà pourquoi on me propose une UNION et que tu me proposes cette requête, je n'avais pas précisé ça au début...
    (C'était le but du php, avec double boucle while... etc...)

    Du coup, cette requête fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT annee, (COALESCE(SUM(abonnement),0) + COALESCE(SUM(consommation),0) + COALESCE(SUM(autres),0) - COALESCE(SUM(remise),0)) * 1.196 FROM (
        SELECT * FROM TEL_FIXE_ANALYSE 
        UNION
        SELECT * FROM TEL_MOBILE_ANALYSE
    ) AS t GROUP BY annee;
    Merci à vous !

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Utilisez plutôt UNION ALL qui ne fait pas de DISTINCT

  7. #7
    Invité
    Invité(e)
    Par défaut
    C'est noté ! Merci

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

Discussions similaires

  1. errno 121 sans contraintes
    Par Federico_muy_bien dans le forum MySQL
    Réponses: 1
    Dernier message: 22/06/2009, 10h38
  2. Innodb Jointure sans LEFT JOIN
    Par mokadjo dans le forum Requêtes
    Réponses: 6
    Dernier message: 15/04/2009, 16h50
  3. Jointure sans tenir compte de la casse
    Par Elise49 dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 05/03/2009, 11h33
  4. Jointure sans le produit
    Par defcon_suny dans le forum Langage SQL
    Réponses: 9
    Dernier message: 11/07/2008, 08h55
  5. [PHP-JS] Redirection sans contrainte
    Par MANU_2 dans le forum Langage
    Réponses: 22
    Dernier message: 05/10/2006, 13h12

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