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

Access Discussion :

[SQL] Aide pour requête


Sujet :

Access

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut [SQL] Aide pour requête
    Bonjour à tous,
    Je galère sur une requête SQL sous Access :
    Prenons un exemple simple :
    Ma première table répertorie les différents achats des client.

    STRUCTURE :
    NUM : Numéro auto de l'achat. --> clé primaire
    NUM_CLIENT : Numéro du client
    PRODUIT : Nom du produit
    PRIX : Prix du produit

    Ma deuxième table se compose des différents produits

    STRUCTURE :
    PRODUIT : Le nom produit en diminutif = Table1.PRODUIT --> clé primaire
    NOM_PRODUIT : Le nom du produit au complet
    NOM_NATURE : La nature du produit
    Je precise que tout celà est un exemple afin d'expliquer au mieux mon problème .

    J'aimerai pouvoir récupérer la liste des achat d'un client en détail ou pas.

    Table des achats :
    1|C_1|ORAN|2.78€|
    2|C_1|VIS |3.30€|
    3|C_1|MART|9.50€|
    4|C_1|BANA|2.12€|
    5|C_1|CHEM|55.11€|
    6|C_1|ORAN|3.14€|


    Table des produits :
    ORAN |"Oranges d'Afrique"|ALIM|
    VIS |"Vis à visser "|OUTIL|
    MART |"Marteau "|OUTIL|
    BANA |"Bananes "|ALIM|
    CHEM |"Chemise nic "|VETEM|
    ALIM |"Alimentation "|NULL|
    OUTIL|"Outillage "|NULL|
    VETEM|"Vêtement "|NULL|
    Donc, si je veux avoir les achats du Client C_1 , j'aurais :

    En détail :
    //Regroupement par produit
    Oranges d'Afrique -----> 5.92 €
    Vis à visser -----> 3.30 €
    Marteau -----> 9.50 €
    Banane -----> 2.12 €
    Chemise nic -----> 55.11 €

    Total -----> 75.95 €

    Regroupé
    //Regroupement par nature
    Alimentation ------> 8.04 €
    Outillage ------> 12.80 €
    Vêtement ------> 55.11 €

    Total -------> 75.95 €
    Bon, le détail n'est pas très compliqué à faire. Par contre , le groupement est un peu plus complexe.
    La création d'une table comprenant les Natures serait-elle inévitable ?

    Merci de m'avoir accordé quelques minutes de votre temps.

  2. #2
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2003
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 144
    Points : 112
    Points
    112
    Par défaut
    Bonjour,

    il faut que tu fasses une requête d'agrégation avec une clause group by :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select num_client, nom_nature from achat, produit
    where produit.produit=achat.produit
    group by num_client, nom_nature
    order by 1, 2
    Au passage, il vaut mieux avoir des clés primaires numériques (table produits) et créer une table Nature reliée à la table produit par un champ numérique sous forme de liste déroulante.
    A+

  3. #3
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 128
    Points : 12 185
    Points
    12 185
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Je pense que cela doit te convenir...
    //Regroupement par produit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TBLProduits.NOM_PRODUIT, Sum(TBLClientProduit.PRIX) AS SommeDePRIX
    FROM TBLClientProduit INNER JOIN TBLProduits ON TBLClientProduit.PRODUIT = TBLProduits.PRODUIT
    GROUP BY TBLProduits.NOM_PRODUIT;
    //Regroupement par nature
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TBLProduits.NOM_NATURE, Sum(TBLClientProduit.PRIX) AS SommeDePRIX
    FROM TBLClientProduit INNER JOIN TBLProduits ON TBLClientProduit.PRODUIT = TBLProduits.PRODUIT
    GROUP BY TBLProduits.NOM_NATURE;
    Argy

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Merci à vous, mais, j'ai oublié de préciser :
    - Mettre le tout en un seul code SQL vu que des fois, un produit ne possède pas de nature --> Qui dans ce cas là doit être au format détaillé (Prendre juste le nom du produit et pas celui de la nature vu qu'il n'y en a pas)

  5. #5
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2003
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 144
    Points : 112
    Points
    112
    Par défaut
    Ah, bah non, tu ne peux pas avoir du regroupement et du détaillé dans la même requête.
    Tu peux éventuellement créeer un état qui comporte deux sous états répondant à ces critères.

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Heu voilà à quoi j'arrive au niveau logique personel en SQL (Et pas logique pour Access )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT IIF(COUNT(P1.MNE_MNE) = 1,P1.MNE_MNE,P.MNE_MNE),  IIF(COUNT(P1.MNE_MNE) = 1,P1.MNE_INTC,P.MNE_INTC), SUM(M.MVT_MNT) AS SOLDE
    FROM ((D_MVT AS M 
    INNER JOIN D_MNE AS P ON P.MNE_MNE=M.MVT_NAT)
          LEFT JOIN D_MNE As P1 ON P1.MNE_MNE = P.MNE_REG)
    WHERE M.MVT_ACT=[:ACT]
    GROUP BY 1,2 ;
    Il bloque aux IIF !! Pourquoi ?
    Faut dire aussi que sans explication de ma part sur ce code, vous n'allez pas aller bien loin

  7. #7
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2003
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 144
    Points : 112
    Points
    112
    Par défaut
    Il me semble que IIF n'est pas une instruction SQL.

  8. #8
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par jfox
    Il me semble que IIF n'est pas une instruction SQL.
    Dans Access oui

  9. #9
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Bon, j'arrive tout doucement au résultat souhaité

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT IIF(COUNT(P1.MNE_MNE) > 0 ,P1.MNE_MNE,P.MNE_MNE),  IIF(COUNT(P1.MNE_MNE) > 0,P1.MNE_INTC,P.MNE_INTC), SUM(M.MVT_MNT) AS SOLDE 
    FROM ((D_MVT AS M 
    INNER JOIN D_MNE AS P ON P.MNE_MNE=M.MVT_NAT) 
          LEFT JOIN D_MNE As P1 ON P1.MNE_MNE = P.MNE_REG) 
    WHERE M.MVT_ACT=[:ACT] 
    GROUP BY P1.MNE_MNE,  P1.MNE_INTC , P.MNE_MNE, P.MNE_INTC
    ORDER BY 1
    Le problème réside dans la clause ORDER BY.
    Avec le code si dessus j'ai ce résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Alimentation -----> 5.92 € 
    Outillage      -----> 3.30 € 
    Outillage      -----> 9.50 € 
    Alimentation -----> 2.12 € 
    Vêtement     -----> 55.11
    En gros, ce qu'il me faudrait c'est faire un ORDER BY 1,2. Mais comme cela, ca ne va pas dans Access

Discussions similaires

  1. Aide pour requête SQL assez simple
    Par Pilloutou dans le forum Langage SQL
    Réponses: 15
    Dernier message: 28/03/2008, 15h07
  2. [SQL Server 2005] Besoin d'aide pour requête
    Par Definol dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/07/2007, 13h55
  3. Besoin d'aide pour requête SQL
    Par dinver78 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 21/05/2007, 18h20
  4. [SQL] aide pour construire une requête
    Par mealtone dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 04/08/2006, 15h16
  5. Besoin d'aide pour requête SQL
    Par vallica dans le forum Requêtes
    Réponses: 10
    Dernier message: 08/06/2006, 23h16

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