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

Requêtes et SQL. Discussion :

Probleme de requete SQL


Sujet :

Requêtes et SQL.

  1. #1
    Membre habitué Avatar de arcane
    Inscrit en
    Avril 2003
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 311
    Points : 178
    Points
    178
    Par défaut Probleme de requete SQL
    Bonjour,

    je ne sais pas trop ou poser cette question : Access ou SQL.
    Je voudrais faire des calculs avec les resultats de requetes.
    j'ai une base :
    T1 id_t1 *
    nom
    code

    T2 id_t2 *
    nom
    code

    T3 id_t3 *
    nom
    code

    L1 id_t1
    id_t2
    pourcentage

    L2 id_t2
    id_t3
    pourcentage

    Je voudrais pouvoir additionner les 2 pourcentages en choisissant un champ T1
    si les champs T3 sont identiques.
    j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT T3.nom, (L2.pourcentage*L1.pourcentage) AS "pourcentage_calcule", 
    T2.nom, T1.nom
    FROM T1, T2, T3, L1, L2
    WHERE (T3.id_t3=L2.id_t3 AND
    L2.id_t2=T2.id_t2 AND
    T2.id_t2=L1.id_t2 AND
    L1.id_t1=T1.id_t1 AND
    T1.nom="toto")
    ORDER BY (pourcentage_calcule);
    (il faut remplacer pourcentage_calcule par (L2.pourcentage*L1.pourcentage),
    je sais pas pourquoi)


    Cette requete marche, elle me donne le bon resultat, sauf que par exemple,
    si 2 champs de T3 sont identiques j'aurai le pourcentage pour chaque,
    et la je voudrais qu'il me les additionne.
    j'ai essayé GROUP BY T3 mais il me dit :
    "vous avez essayé d'executer une requete ne comprenant pas
    l'expression specifiee 'T3.nom' comme une partie de la fonction d'agregat."
    Si je rajoute tous les champs, le resultat est le meme.

    En fait, on doit avoir toutes les colonnes de la cause group by
    dans la clause select et toutes les colonnes de la clause select
    sans fonction d'agregation doivent figurer dans la clause group by.
    (je vois pas bien a quoi ca correspond ici)


    Note : je ne peux pas utiliser DISTINCT : conflit avec ORDER BY

    j'ai pensé utiliser SUM, mais c'est toujours pareil.


    Je voudrais savoir s'il est possible de contourner ce pb en recuperant
    le resultat dans un recordset et avec un 2eme recordset recuperer chaque ligne
    du premier, et remplir le 2eme avec la somme de tous les pourcentages dont les
    champs de T3 sont identiques.
    Je vois pas trop comment partir dans ce cas.
    Je prefererais trouver la bonne requete...

    Merci pour votre aide.

  2. #2
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    400
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 400
    Points : 444
    Points
    444
    Par défaut
    Ce que tu essaye de faire est impossible en une requete. Tu doit passé par de recordset. On ne peut pas faire un group sur seulement une partie d'une requête SQL. En plus, tu pourra pas faire une somme uniquement lorsque les T3 sont égaux. Il faut le faire tout au long de la requête.

    Passe par deux recordset.


    Pour ton "pourcentage_calcule", tu n'a fait que renommé la cellule qui va contenir la somme. Tu doit le faire, car tu fait un tri par rapport à cette somme.

  3. #3
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Salut,

    D'abord essaye de mettre des noms de tables et de champs plus parlants, c'est pas évident de raisonner avec T1, T2, L1, ....
    C'est tout de suite plus simple si tu mets des clients, des commandes, ...

    Là c'est juste la solution technique pour faire un regroupement, je n'ai rien compris aux tables sinon et ça ne marche probablement qu'à moitié...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT T3.nom, Sum(([L2].[pourcentage]*[L1].[pourcentage])) AS pourcentage_calcule, T2.nom, T1.nom
    FROM T1, T2, T3, L1, L2
    WHERE (((T3.id_t3)=[L2].[id_t3]) AND ((L2.id_t2)=[T2].[id_t2]) AND ((T2.id_t2)=[L1].[id_t2]) AND ((L1.id_t1)=[T1].[id_t1]) AND ((T1.nom)="toto"))
    GROUP BY T3.nom, T2.nom, T1.nom
    ORDER BY Sum(([L2].[pourcentage]*[L1].[pourcentage]));
    Et tu devrais songer à mettre des jointures sinon la requête risque d'être très longue quand les tables seront volumineuses.

    Bye.

  4. #4
    Membre éclairé
    Avatar de Didier L
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2004
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 503
    Points : 806
    Points
    806
    Par défaut
    Bonsoir,

    Je ne sais pas si j'ai tout suivi, mais essaye cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT T3.nom, Sum (L2.pourcentage*L1.pourcentage) AS "pourcentage_calcule" 
    FROM T1, T2, T3, L1, L2 
    WHERE (T3.id_t3=L2.id_t3 AND 
    L2.id_t2=T2.id_t2 AND 
    T2.id_t2=L1.id_t2 AND 
    L1.id_t1=T1.id_t1 AND 
    T1.nom="toto") 
    Group By T3.nom
    ORDER BY (pourcentage_calcule)
    Je résume:
    Je filtre mon résultat grace au Nom De T1 :
    Je fais la somme de mes pourcentages pour tous les Noms de T3 identiques:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ...,Sum (L2.pourcentage+L1.pourcentage) ...
    Group By T3.nom
    Je ne fais pas affiché le noms de T1 ou T2 sauf si on est sur qu'ils sont identiques pour un même nom de T3 et dans ce cas il faut aussi qu'il soient dans la clause "Group By"

    Ai-je compris ou loupé une étape ?
    @+


    Pensez au tag

  5. #5
    Membre habitué Avatar de arcane
    Inscrit en
    Avril 2003
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 311
    Points : 178
    Points
    178
    Par défaut
    Bonjour,

    merci pour les reponses, je vais tester tout ca.
    Si ca peut aider certains :
    c'est la meme base :
    Menu id_menu *
    nom
    code

    Sous_menu id_sous_menu *
    nom
    code

    Ingredient id_ingredient *
    nom
    code

    Lien_menu_sous_menu id_menu
    id_sous_menu
    pourcentage

    Lien_sous_menu_ingredient id_sous_menu_ingredient
    id_ingredient
    pourcentage


    c'est a dire pour un menu, il est composé de 2 sous menus, (à 40pc et 60 pc par ex.)
    composés eux memes de plusieurs ingredients, dont par ex. de l'huile.
    On peut retrouver de l'huile dans les 2 sous menus, et je voudrais additionner ces 2 pourcentages
    au lieu d'avoir au final 2 lignes avec de l'huile en avoir que une seule, correspondant
    au pourcentage total de l'huile contenu dans le menu.

    C'est peut etre plus clair comme ca.

  6. #6
    Membre habitué Avatar de arcane
    Inscrit en
    Avril 2003
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 311
    Points : 178
    Points
    178
    Par défaut
    Voila, donc apres test, j'ai 2 requetes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Ingredient.nom, SUM(Lien_sous_menu_ingredient.pourcentage*Lien_menu_sous_menu.pourcentage) AS ["pourcentage_calcule"]
    FROM ingredient AS I, sous_menu AS SM, lien_sous_menu_ingredient AS LSMI , lien_menu_sous_menu AS LMSM , menu AS M
    WHERE (I.id_ingredient=LSMI.id_ingredient And LSMI.id_sous_menu=SM.id_sous_menu And SM.id_sous_menu=LMSM.id_sous_menu And LMSM.id_menu=M.id_menu And M.nom_menu="Tarte aux pommes")
    GROUP BY Ingredient.nom
    ORDER BY (SUM(LSMI.pourcentage*LMSM.pourcentage));
    et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Ingredient.nom SUM(Lien_sous_menu_ingredient.pourcentage*Lien_menu_sous_menu.pourcentage) AS ["pourcentage_calcule"], sous_menu.nom, menu.nom
    FROM ingredient AS I, sous_menu AS SM, lien_sous_menu_ingredient AS LSMI , lien_menu_sous_menu AS LMSM , menu AS M
    WHERE (I.id_ingredient=LSMI.id_ingredient And LSMI.id_sous_menu=SM.id_sous_menu And SM.id_sous_menu=LMSM.id_sous_menu And LMSM.id_menu=M.id_menu And M.nom_menu="Tarte aux pommes")
    GROUP BY Ingredient.nom, sous_menu.nom, menu.nom
    ORDER BY (SUM(LSMI.pourcentage*LMSM.pourcentage));
    la premiere fonctionne correctement, j'ai bien la somme des pourcentages.
    C'est exactement ce que je veux.
    Par contre, il me manque l'affichage des menus et sous_menus.
    La deuxieme ne fonctionne pas, et pourtant j'ai juste rajouté l'affichage (et les champs dans group by)

    Qqn a une idée sur la difference entre ces 2 requetes?

    Merci

  7. #7
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Salut,

    C'est le sous-menu qui ne va pas.
    Tu ne peux pas l'utiliser dans ta requête si tu ne veux qu'une ligne par ingrédient.
    Comme chaque ingrédient peut provenir de plusieurs sous-menu et que tu ne veux qu'une ligne par ingrédient, quel sous-menu veux tu sur ta ligne?
    Pour le menu y a pas de problème, c'est le critère de la requête donc il ny' en a qu'un.

  8. #8
    Membre habitué Avatar de arcane
    Inscrit en
    Avril 2003
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 311
    Points : 178
    Points
    178
    Par défaut
    Et oui, avec un peu de cervelle, j'aurais pu trouver.
    Je ne peux effectivement pas choisir quel sous_menu sera affiché.
    Maintenant, c'est évident !

    Merci a tous!

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

Discussions similaires

  1. [MySQL] probleme de requete sql dans mon php
    Par carmen256 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 14/04/2006, 00h30
  2. Probleme de requete SQL avec la valeur NULL
    Par samyghan dans le forum Installation
    Réponses: 8
    Dernier message: 12/03/2006, 17h24
  3. Probleme de requete SQL avec un champs date
    Par ju360modena dans le forum ASP
    Réponses: 5
    Dernier message: 16/06/2005, 11h18
  4. Probleme Session/requete SQL
    Par kolib dans le forum ASP
    Réponses: 4
    Dernier message: 14/06/2005, 16h23
  5. probleme avec requete sql aime pas les strings
    Par lil_jam63 dans le forum Bases de données
    Réponses: 3
    Dernier message: 24/02/2004, 14h45

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