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 :

Je seche sur une requete


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut Je seche sur une requete
    Bonjour à tous,

    Je sèche sur une requête.
    J'ai plusieurs tables :

    - Client
    - Commande
    - Article
    - Famille Article

    Je souhaite sortir une liste du volume commandé par client et famille.

    J'ai donc fait cela :

    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
     
    SELECT
    client.no AS NoClient,
    (SELECT
    SUM(commande.quantite) 
    FROM
    commande
    JOIN 
    article
    ON article.no=commande.article
    WHERE  commande.client=client.no
    ) AS Volume,
     
    FROM
     client
     
    ORDER BY client.no
    Cette requête fonctionne et me ressort bien par client le volume commandé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Client1;100
    Client2; 150
    ...
    Je voudrais faire un regroupement par famille produit pour avoir ce résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Client1;Famille1;25
    Client1;Famille2;75
    Client2;Famille1;100
    Client2;Famille2;50
    ...
    Je ne vois pas trop comment faire... mais je vais essayer ça en attendant une rep :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT art.famille, cl.id_client, SUM(co.quantite) AS qte
    FROM commande
    JOIN article
    ON article.id=commande.article
    JOIN client
    ON commande.client=client.id
    GROUP BY art.famille, cl.id_client
    Merci d'avance de votre aide.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Votre proposition me paraît correcte et bien meilleure que votre première requête, quel est votre problème ?

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut
    Effectivement ma deuxième proposition fonctionne, en fait j'ai résolu ce premier problème tout seul comme quoi...

    Mais j'ai une deuxième colle...
    Car j'ai ma table commande mais j'ai aussi ma table chiffre d'affaire.
    Elle est identique à celle des commandes (il y un champ article et client et le montant du CA)

    Je souhaiterais ajouter ce champ CA (la somme en fait), pour avoir un résultat du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Client1;Famille1;25;1000€
    Client1;Famille2;75;3000€
    Client2;Famille1;100;4000€
    Client2;Famille2;50;2000€
    ...
    J'ai envi de tenter ça mais j'y crois pas trop :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    SELECT art.famille, cl.id_client, SUM(co.quantite) AS qte,  SUM(ca.montant) AS tot_ca
    FROM commande, chiffre_affaire
    JOIN article
    ON article.id=commande.article
    AND article.id=chiffre_affaire.article
    JOIN client
    ON commande.client=client.id
    AND client.id.id=chiffre_affaire.client
    GROUP BY art.famille, cl.id_client
    Merci d'avance de votre aide.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Non là par contre ça ne fonctionnera pas !
    Il faut d'abord calculé votre montant commandé par client, de même pour le CA et ensuite faire les bonnes jointures.

    Basez-vous sur ces deux requêtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      SELECT article, client, sum(montant) as montant_ca
        FROM chiffre_affaire
    GROUP BY article, client;
     
      SELECT article, client, sum(quantite) as quantite_co
        FROM commande
    GROUP BY article, client;

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut
    J'ai envie de faire une jointure avec UNION mais ça va ajouter des lignes alors que je veux ajouter un champ ?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    UNION n'est pas une jointure justement. Joignez les deux requêtes sur les colonnes article et client.

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 802
    Points
    30 802
    Par défaut
    Il suffit de faire une jointure entre les deux requêtes proposées par Waldar
    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
    SELECT  ca.article
        ,   ca.client
        ,   ca.montant_ca
        ,   co.quantite_co
    FROM    (   SELECT  article
                    ,   client
                    ,   sum(montant) AS montant_ca
                FROM    chiffre_affaire
                GROUP BY article
                    ,   client
            )   AS  ca
        INNER JOIN
            (   SELECT  article
                    ,   client
                    ,   sum(quantite) AS quantite_co
                FROM    commande
                GROUP BY article
                    ,   client
            )   AS co
            ON  co.article  = ca.article
            AND co.client   = ca.client
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut
    Merci, alors voilà ce que ça donne (j'ai fait un regroupement par famille article mais je ne sais pas si il est optimisé) :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    SELECT  
     
    	CA.[Sell-to Customer No_] AS Client,
    	CA.[Item Disc_ Group] AS Famille,
     
       	Volume.volume_commande AS Volume1,
        	CA.chiffre_affaire AS CA1
     
    FROM    (   	SELECT 		[BDD$Sales Invoice Line].[Sell-to Customer No_],
    				[BDD$Item].[Item Disc_ Group],
    				[BDD$Sales Invoice Line].[Shipment Date],
                    		SUM([BDD$Sales Invoice Line].[Amount]) AS chiffre_affaire
     
    		FROM    	[BDD$Sales Invoice Line]
     
    		JOIN 		[BDD$Item]
    		ON		[BDD$Item].[No_]=[BDD$Sales Invoice Line].[No_]
     
    		GROUP BY 	[BDD$Sales Invoice Line].[Sell-to Customer No_],
    				[BDD$Sales Invoice Line].[Shipment Date],
    				[BDD$Item].[Item Disc_ Group]
            )   AS  CA
     
    INNER JOIN
    	   (   	SELECT 		[BDD$Sales Line].[Sell-to Customer No_],
    				[BDD$Item].[Item Disc_ Group],
    				[BDD$Sales Line].[Shipment Date],
                    		SUM([BDD$Sales Line].[Quantity]) AS volume_commande
     
    		FROM    	[BDD$Sales Line]
     
    		JOIN 		[BDD$Item]
    		ON		[BDD$Item].[No_]=[BDD$Sales Line].[No_]
     
    		GROUP BY 	[BDD$Sales Line].[Sell-to Customer No_],
    				[BDD$Sales Line].[Shipment Date],
    				[BDD$Item].[Item Disc_ Group]
            )   AS  Volume
     
    ON  Volume.[Item Disc_ Group] = CA.[Item Disc_ Group]
    AND Volume.[Sell-to Customer No_] = CA.[Sell-to Customer No_]
    AND YEAR(Volume.[Shipment Date])='2009'
    AND MONTH(Volume.[Shipment Date])='12'
    AND YEAR(CA.[Shipment Date])='2009'
    AND MONTH(CA.[Shipment Date])='12'
     
     
    INNER JOIN	[BDD$Customer]
    ON Volume.[Sell-to Customer No_]=[BDD$Customer].[No_]
    AND CA.[Sell-to Customer No_]=[BDD$Customer].[No_]
    AND [BDD$Customer].[Customer Disc_ Group]='DPT1'
    Je dois maintenant faire apparaitre deux champs supplémentaire, le mois m-1 du volume et du chiffre d'affaire.
    Je compte ajouter deux jointures et faire mes recherches sur le mois à l'intérieur de chacune d'elles, est-ce une bonne solution ?

    Merci d'avance de votre aide.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Inutile de mettre une condition sur le mois dans la seconde requête, vous la joindrez à la requête principale sur les colonnes client, famille et mois=mois-1.

Discussions similaires

  1. Je seche sur une requete (not in)
    Par BuzzLeclaire dans le forum Bases de données
    Réponses: 7
    Dernier message: 17/12/2008, 19h44
  2. transformation sur une requete SELECT
    Par juniorAl dans le forum Langage SQL
    Réponses: 8
    Dernier message: 08/04/2005, 18h12
  3. petite aide sur une requete INSERT INTO
    Par bonneti dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/03/2005, 15h17
  4. Aide sur une requete de sélection
    Par stephdiplo150 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/01/2004, 10h40
  5. []débogage sur une requête dasn visual basic
    Par mcay dans le forum VB 6 et antérieur
    Réponses: 19
    Dernier message: 24/09/2003, 09h59

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