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 :

Jointures entre de mutiples tables


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 11
    Points : 14
    Points
    14
    Par défaut Jointures entre de mutiples tables
    Bonjour,

    Je cherche a obtenir le résultat que j'arrive à avoir avec 2 requpetes différentes sur des tables similaires que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DF.reference, SUM(DF.quantite) AS quantite, MONTH(DF.date) AS mois, YEAR(DF.date) AS annee FROM detailfactures DF LEFT JOIN factures F ON DF.numfacture=F.numfacture LEFT JOIN produits P ON DF.reference=P.reference WHERE P.idsousgamme= :idsousgamme AND DF.date BETWEEN :datedebut AND :datefin AND F.iddistributeur= :iddistributeur GROUP BY P.idgamme, DF.reference, annee, mois
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CL.referenceproduit, SUM(CL.quantiteproduit) AS quantite, MONTH(L.datelivraison) AS mois, YEAR(L.datelivraison) AS annee FROM contenulivraison CL DF LEFT JOIN livraison L ON CL.idlivraison=L.idlivraison LEFT JOIN produits P ON CL.referenceproduit=P.reference WHERE P.idsousgamme= :idsousgamme AND L.datelivraison BETWEEN :datedebut AND :datefin AND L.iddistributeur= :iddistributeur GROUP BY P.idgamme, CL.referenceproduit, annee, mois
    Concrètement, les deux requêtes récupèrent les références avec comme condition un laps de temps définit, un identifiant et une gamme spécifique et ça fonctionne. Il y a en effet de grosse similitude entre les deux requêtes.

    Par contre, j'essaie d'avoir un résultat me permettant de récupérer les deux résultats en un seul pour faciliter l'utilisation côté PHP.

    Je ne demande pas la réponse mais si possible qu'on m'aiguille sur la ligne à suivre notamment en ce qui concerne la tournure de la requête et/ou la ou les jointures à utiliser.

    Merci.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 199
    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 199
    Points : 12 775
    Points
    12 775
    Par défaut
    Bonjour,
    Pour pouvoir t'aider il nous faudrait à minima la description des tables concernées, et les liens entre elles.
    Un petit jeu de données et le résultat attendu serait aussi utile.

    Tatayo.

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 893
    Points
    38 893
    Billets dans le blog
    9
    Par défaut
    Je suppose que vous utilisez MySQL, car tout autre SGBD aurait refusé vos requêtes dont la clause SELECT et la clause GROUP BY sont incohérentes.
    Une fois la présentation revue (je déteste les requêtes écrites sur une seule ligne : c'est illisible), ça saute aux yeux :

    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
    SELECT DF.reference
         , SUM(DF.quantite) AS quantite
         , MONTH(DF.date)   AS mois
         , YEAR(DF.date)    AS annee 
    FROM       detailfactures DF 
    LEFT JOIN  factures       F 
       ON  DF.numfacture=F.numfacture 
    LEFT JOIN  produits       P 
       ON  DF.reference=P.reference 
    WHERE P.idsousgamme= :idsousgamme 
      AND DF.date BETWEEN :datedebut AND :datefin 
      AND F.iddistributeur= :iddistributeur 
    GROUP BY P.idgamme
           , DF.reference
           , annee
           , mois

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    La clause GROUP BY me semble correcte, elle regroupe bien sur les trois colonnes qui ne sont pas agrégées dans le SELECT. Il y a juste la colonne P.idgamme en plus, qui semble juste inutile, mais pas incorrecte pour autant.


    Pour le problème initial, un UNION ALL devrait faire l'affaire

    un truc dans ce gout là :

    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
    26
    27
    28
    29
    30
    31
    32
    33
     
    SELECT 
    		R.referenceproduit
    	,	SUM(R.quantiteproduit) AS quantite
    	,	MONTH(R.datelivraison) AS mois
    	,	YEAR(R.datelivraison) AS annee 
    FROM (
    	SELECT 
    			DF.reference
    		,	DF.quantite
    		,	DF.date
    		,	F.iddistributeur
    	FROM detailfactures DF 
    	LEFT JOIN factures F ON DF.numfacture=F.numfacture 
    	UNION ALL
    	SELECT 
    			CL.referenceproduit
    		,	CL.quantiteproduit
    		,	L.datelivraison
    		,	F.iddistributeur
    	FROM contenulivraison CL DF
    	LEFT JOIN livraison L ON CL.idlivraison=L.idlivraison 
    ) AS R 
    LEFT JOIN produits P ON DF.reference=P.reference 
    WHERE 
    	P.idsousgamme= :idsousgamme 
    	AND R.date BETWEEN :datedebut AND :datefin 
    	AND R.iddistributeur= :iddistributeur 
    GROUP BY 
    		R.idgamme
    	,	R.reference
    	,	annee
    	,	mois

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 781
    Points : 52 770
    Points
    52 770
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,

    La clause GROUP BY me semble correcte, elle regroupe bien sur les trois colonnes qui ne sont pas agrégées dans le SELECT. Il y a juste la colonne P.idgamme en plus, qui semble juste inutile, mais pas incorrecte pour autant.


    Pour le problème initial, un UNION ALL devrait faire l'affaire

    un truc dans ce gout là :

    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
    26
    27
    28
    29
    30
    31
    32
    33
     
    SELECT 
    		R.referenceproduit
    	,	SUM(R.quantiteproduit) AS quantite
    	,	MONTH(R.datelivraison) AS mois
    	,	YEAR(R.datelivraison) AS annee 
    FROM (
    	SELECT 
    			DF.reference
    		,	DF.quantite
    		,	DF.date
    		,	F.iddistributeur
    	FROM detailfactures DF 
    	LEFT JOIN factures F ON DF.numfacture=F.numfacture 
    	UNION ALL
    	SELECT 
    			CL.referenceproduit
    		,	CL.quantiteproduit
    		,	L.datelivraison
    		,	F.iddistributeur
    	FROM contenulivraison CL DF
    	LEFT JOIN livraison L ON CL.idlivraison=L.idlivraison 
    ) AS R 
    LEFT JOIN produits P ON DF.reference=P.reference 
    WHERE 
    	P.idsousgamme= :idsousgamme 
    	AND R.date BETWEEN :datedebut AND :datefin 
    	AND R.iddistributeur= :iddistributeur 
    GROUP BY 
    		R.idgamme
    	,	R.reference
    	,	annee
    	,	mois
    Ton GROUP BY est faux…. Tu doit reprendre les expressions telles quelles.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    GROUP BY R.referenceproduit,
             MONTH(R.datelivraison),
             YEAR(R.datelivraison)
    En effet cette syntaxe peut être accepté par MySQmerde… Mais par aucun autre SGBDR et heureusement !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    oui en effet, merci pour la correction.

    J'étais parti pour extraire l'année et le mois dans les sous requêteq, mais ça obligeait à mettre deux fois le filtre sur la date, j'ai donc changé, mais pas modifié le GROUP BYPar ailleurs, il me semble qu'outre MySQL, PostGre autorise également cette syntaxe.

Discussions similaires

  1. [SSIS][2k5] jointure entre très grosse table
    Par RicardMan dans le forum SSIS
    Réponses: 1
    Dernier message: 18/04/2008, 16h54
  2. Jointure entre deux grandes tables?
    Par mbouzouita dans le forum JPA
    Réponses: 1
    Dernier message: 05/05/2007, 08h29
  3. Jointure entre deux tables et résultat
    Par Asdorve dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/06/2004, 14h50
  4. [jointure]requete possible de double jointure entre 2 tables
    Par akira_le_gaucher dans le forum Langage SQL
    Réponses: 4
    Dernier message: 11/05/2004, 15h03
  5. Jointure entre 2 tables et OR
    Par PyRoFlo dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/02/2004, 18h42

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