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 :

[Access] problème avec une sous-requête


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 22
    Points : 15
    Points
    15
    Par défaut [Access] problème avec une sous-requête
    Bonjour à tous,
    j'ai un problème avec une sous-requête. Avant tout, voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT A.representant, (select Sum(prospection_rdv) 
    FROM IT_CFEfacturation
    where IT_CFEfacturation.vpr = A.vpr
    ) AS S_prospection_rdv, (SELECT sum(f_normecheque_p)
    FROM IT_facturation 
    where IT_facturation.vpr = A.vpr
    ) AS S_normecheque_f INTO d
    FROM (representant AS A INNER JOIN IT_CFEfacturation ON A.vpr = IT_CFEfacturation.vpr) INNER JOIN IT_facturation ON A.vpr = IT_facturation.vpr
    GROUP BY A.representant;
    Comme vous le voyez, j'ai trois tables: une qui contient un type de produit, une autre qui contient un autre type de produit et une derniere qui contient tout les représentants. La clé commune des trois tables est VPR.

    En somme, ce que je veux faire c'est une table sommaire qui regroupe le nombre de client pour chaque produit par représentant.

    Merci !!

    JS

  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    et le probleme est? mystere!

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    le problème c'est que ça fait la somme totale des produits et ensuite la divise en nombre de représentants. L'astuce est que les représentants sont attitrés à plusieurs territoires.....

    Merci

    JS

  4. #4
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Je vais illustrer mon interrogation, elle sera plus facile à comprendre . J'ai trois tables:

    1. table du volume de vente des produits particuliers

    territoire produit ABC produit DEF
    1 45 20
    2 32 45
    3 12 34

    2. table du volume de vente des produits entreprises

    territoire produit GHI produit JKL
    1 45 20
    2 32 45
    3 12 34

    3. TABLE REPRÉSENTANT

    territoire rep
    1 paul
    2 paul
    3 steve

    Ce que je veux c'est un sommaire de du volume des produits vendus par représentant :

    rep produit ABC ....
    Paul 77
    steve 12

    En espérant que ce soit plus simple de cette façon!

  5. #5
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Ce que tu veux, c'est une requête de type "tableau croisé", à partir de tables qui sont elles-mêmes dénormalisées en tableaux croisés (la normalisation serait d'avoir une table Produits et une table Ventes avec IDterr, IDproduit, VolumeVente).

    Les requêtes de type "tableau croisé" sont faciles à faire à condition de connaître à l'avance la liste des colonnes (donc en l'occurence des produits).

    Je te rédige un exemple avec la nomenclature de ton dernier message, qui est plus facile à comprendre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT R.Rep, SUM(Pdt_ABC), SUM(Pdt_DEF), ...
    FROM Representants R
      LEFT JOIN Produits_Partic PP ON R.terr = PP.terr
      LEFT JOIN Produits_Entrep PE ON R.terr = PE.terr
    GROUP BY R.Rep
    L'inconvénient est que, bien sûr, tu dois modifier ta requête à chaque nouveau produit. Si ta liste de produits n'est pas suffisamment stable, tu dois donc générer une requête du type de celle-ci en utilisant soit du SQL dynamique, soit un langage-hôte comme PHP...

    --
    Antoun

    Guide complet MySQL 5, par Antoine Dinimant, éd. MicroApplication
    http://www.microapp.com/livre_mysql_7873.html

  6. #6
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Merci Antoun, par contre le code ne fonctionne pas pour SQL dans Access. On me dit "opérateur absent" entre les deux left join. Dans ton message, tu as mentionné que mes tables sont dénormalisées. Est-ce grave? Devrais-je modifier mes tables?

    Merci

    JS

  7. #7
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par dirtyjs
    Par contre le code ne fonctionne pas pour SQL dans Access. On me dit "opérateur absent" entre les deux left join.
    pour Access, il faut encapsuler les jointures d'une manière assez particulière, tu trouveras sans doutes des exemples sur ce forum puisque ce problème a déjà été évoqué plusieurs fois.

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Désolé, je n'avais pas fait attention que c'était du Access. L'encapsulation dont parle Xo n'est nécessaire que si tu passes par un ODBC. Sinon, il suffit de rajouter des parenthèses et AS entre le nom et l'alias de chaque table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT R.Rep, SUM(Pdt_ABC), SUM(Pdt_DEF), ...
    FROM (Representants R
      LEFT JOIN Produits_Partic AS PP ON R.terr = PP.terr)
      LEFT JOIN Produits_Entrep AS PE ON R.terr = PE.terr
    GROUP BY R.Rep
    Pour ce qui est de la dénormalisation, non ce n'est pas grave, oui dans l'absolu tu devrais modifier, mais cela risque de t'obliger à revoir toute ton application (à commencer par la requête ci-dessus). Ne le fais donc que si tu es au début de ton projet.

  9. #9
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    merci Antoun, mais la requête multiplie les champs, donc au-lieu d'obtenir 230 pour un représentant j'obtiens 700 !!!!

    Pour l'autre point de normalisation, je suis au début de la conception de la base. Comment pourrais-je donc normaliser la BD??

    Merci

    JS

  10. #10
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Je viens de remarquer que les sum () que tu fais viennent de la meme table que les representants. Voici le code que j'ai fait :
    SELECT r.representant, Sum(b.prospection_rdv) AS S_prospection_rdv, Sum(d.normecheque_envois) AS S_normecheque_p INTO e
    FROM (representant AS r left JOIN IT_CFEfacturation AS b ON r.vpr = b.vpr) left JOIN IT_RIT072006 AS d ON r.vpr = d.vpr
    GROUP BY r.representant;

    JS

  11. #11
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par Antoun
    Désolé, je n'avais pas fait attention que c'était du Access. L'encapsulation dont parle Xo n'est nécessaire que si tu passes par un ODBC.
    En fait, c'est le terme d'imbrication que je voulais utiliser, comme tu l'as illustré

  12. #12
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par dirtyjs
    Pour l'autre point de normalisation, je suis au début de la conception de la base. Comment pourrais-je donc normaliser la BD??
    Comme indiqué dans mon message original :
    Tu mets une table Produits, éventuellement avec un flag Particulier/Entreprise, et une table Ventes avec les colonnes IDterr, IDproduit, VolumeVente.

    Si je reprends ton exemple, cela donne :

    table produit :

    idprod produit clientele
    1 ABC partic
    2 DEF partic
    3 GHI entrep
    4 JKL entrep

    table du volume de vente :

    territoire idproduit volume
    1 1 45
    1 2 20
    2 1 32
    2 2 45
    3 1 12
    3 1 34
    1 3 45
    1 4 20
    2 3 32
    2 4 45
    3 3 12
    3 4 34

    Pour chipoter jusqu'au bout, ta table REPRÉSENTANT devrait être séparée en une table REPRÉSENTANT et une table REPR_TERR :

    TABLE REPRÉSENTANT
    idrep rep
    1 Paul
    2 Steve

    TABLE REPR_TERR :

    territoire rep
    1 1
    2 1
    3 2

    L'avantage est par ex. que lorsque Paul partira et sera remplacé par Fred, tu n'auras à changer qu'une seule fois.

    --
    Antoun

    Guide complet MySQL 5, par Antoine Dinimant, éd. MicroApplication
    http://www.microapp.com/livre_mysql_7873.html

  13. #13
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par dirtyjs
    SELECT r.representant, Sum(b.prospection_rdv) AS S_prospection_rdv, Sum(d.normecheque_envois) AS S_normecheque_p
    [...]
    Si je comprends bien, prospection_rdv et normechque_envois sont tes produits ?

    Access a énormément de défauts, mais il a un avantage qui est de faire nativement des tableaux croisés.

    Avec la modélisation normalisée que je t'ai indiquée, demande une requête "Analyse croisée", et sur la ligne "Analyse" de l'interface graphique, tu places ton représentant en "En-tête de ligne", ton nom de produit en "En-tête de colonne", et la SOMME du Volume de ventes en "Valeur".

    --
    Antoun

    Guide complet MySQL 5, par Antoine Dinimant, éd. MicroApplication
    http://www.microapp.com/livre_mysql_7873.html

Discussions similaires

  1. [MySQL] Correspondance avec une sous-chaîne
    Par ciel65 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 12/01/2007, 15h44
  2. [Access] probleme avec une sous-requête synchronisée
    Par dirtyjs dans le forum Langage SQL
    Réponses: 1
    Dernier message: 11/09/2006, 16h44
  3. [Access] Clause GROUP BY avec une date
    Par Kanie dans le forum Langage SQL
    Réponses: 4
    Dernier message: 10/04/2006, 19h58
  4. Update avec une sous requête
    Par Deejoh dans le forum Installation
    Réponses: 7
    Dernier message: 25/01/2006, 11h50
  5. Requete avec une sous-requete... Ne fonctionne qu'a moitie..
    Par mythtvtalk.com dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 18/08/2003, 09h54

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