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 :

Moyenne de sommes


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 14
    Points : 6
    Points
    6
    Par défaut Moyenne de sommes
    Bonjour tout le monde.

    Tout d'abord, je ne suis pas certain d'être dans la bonne section du forum. Si je me suis trompé, veuillez m'en excuser.

    Je souhaite faire une requête, exécutable sous Infomaker 8 ou SQL-view, qui fonctionne de la façon suivante :
    - j'ai 4 tables : article, gamme, OF et evenements
    - je sélectionne dans la table evenements les durées d'évènements qui sont liés à une opération de gamme (dans la table gamme) et à un OF (dans la table OF) pour un article (dans la table article)

    La requête ci-dessous fonctionne, mais je voudrais la modifier de la façon suivante : au lieu de sélectionner les durées des évènements, je voudrais la moyenne par opération pour un article des sommes des durées des évènements par opération pour un OF.
    En d'autres termes : je fais la somme des durées pour chaque opération sur un OF, puis je fais la moyenne des valeurs obtenues par opération, par article.

    Je n'ai absoluement aucune idée du code à utiliser. Alors si quelqu'un pouvait m'aider d'une quelconque façon, je lui en serais éternellement reconnaissant. ^^

    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 gamme.cd_oper,   
             gamme.des,   
             article.cd_article,   
             evenements.dur_evt,   
             OF.dte_hre_fin_prev,   
             OF.cd_etat_OF,   
             gamme.no_int_ord_fab  
        FROM {oj gamme RIGHT OUTER JOIN evenements ON gamme.no_ste = 
             evenements.no_ste AND gamme.no_int_ord_fab =
             evenements.no_int_ord_fab AND gamme.no_int_opegam_of =
             evenements.no_int_opegam_of},   
             article,   
             OF  
       WHERE ( OF.no_ste = article.no_ste ) and  
             ( OF.no_int_article = article.no_int_article ) and  
             ( gamme.no_int_ord_fab = OF.no_int_ord_fab ) and  
             ( gamme.no_ste = OF.no_ste )

  2. #2
    Futur Membre du Club
    Inscrit en
    Août 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Ma question est-elle peu claire ou est-il impossible de faire ce que je voudrais comme je le voudrais ?
    Si c'est le premier cas, n'hésitez pas à le dire s'il vous plait, j'essaierai de m'expliquer mieux. Si c'est le second, quelqu'un saurait-il comment je pourrais obtenir un résultat approchant par une autre méthode ?
    Merci.

  3. #3
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    OK, tu peux utiliser une requête imbriquée !!!
    Vous faites d'abord le calcule des sommes
    Ensuite celui des moyennes.

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  4. #4
    Futur Membre du Club
    Inscrit en
    Août 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Tu pourrais me donner un exemple de structure pour la requête imbriquée que tu proposes ? Désolé, mais on m'a donné quelquechose à faire alors que je n'ai pas forcément les compétences requises en SQL.

    Merci beaucoup pour l'aide en tout cas.

  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 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Déjà votre requête mélange des jointures norme 1992 avec des jointures à l'ancienne syntaxse. De plus la jointure gauche est assez ambigües. Veuillez aussi utiliser des alias. Enfin les parenthèses ne servent à rien !


    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
    SELECT G.cd_oper,   
           G.des,   
           A.cd_article,   
           sum(E.dur_evt) AS SOMME_DUREE,   
           OF.dte_hre_fin_prev,   
           OF.cd_etat_OF,   
           G.no_int_ord_fab 
     
    FROM   evenement E
           INNER JOIN gamme G
                 ON     E.no_ste           = G.no_ste
                    AND E.no_int_ord_fab   = G.no_int_ord_fab
                    AND E.no_int_opegam_of = GF.no_int_opegam_of
           INNER JOIN OF
                 ON     G.no_int_ord_fab = OF.no_int_ord_fab
                    AND G.no_ste = OF.no_ste
           INNER JOIN article A
                 ON     OF.no_ste = A.no_ste
                    AND OF.no_int_article = A.no_int_article
     
    GROUP  BY G.cd_oper, G.des, A.cd_article, OF.dte_hre_fin_prev,   
              OF.cd_etat_OF, G.no_int_ord_fab
    Voici pourla somme des durées.

    Ensuite pour faire une moyenne des dommes de durée, il faut reprendre votre requête comme ceci :

    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
    SELECT AVG(SOMME_DURE), ???
     
    FROM   (SELECT G.cd_oper,   
                   G.des,   
                   A.cd_article,   
                   sum(E.dur_evt) AS SOMME_DUREE,   
                   OF.dte_hre_fin_prev,   
                   OF.cd_etat_OF,   
                   G.no_int_ord_fab 
     
            FROM   evenement E
                   INNER JOIN gamme G
                         ON     E.no_ste           = G.no_ste
                            AND E.no_int_ord_fab   = G.no_int_ord_fab
                            AND E.no_int_opegam_of = GF.no_int_opegam_of
                   INNER JOIN OF
                         ON     G.no_int_ord_fab = OF.no_int_ord_fab
                            AND G.no_ste = OF.no_ste
                   INNER JOIN article A
                         ON     OF.no_ste = A.no_ste
                            AND OF.no_int_article = A.no_int_article
     
            GROUP  BY G.cd_oper, G.des, A.cd_article, OF.dte_hre_fin_prev,   
                      OF.cd_etat_OF, G.no_int_ord_fab 
           ) T
     
    GROUP BY T. ???
    Votre requête précédente étant logée dans le FROM.

    Pour comprendre SQL; mon site comme mon bouquin peuvent vous y Aider.

    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
    Futur Membre du Club
    Inscrit en
    Août 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par SQLpro
    Déjà votre requête mélange des jointures norme 1992 avec des jointures à l'ancienne syntaxse. De plus la jointure gauche est assez ambigües. Veuillez aussi utiliser des alias. Enfin les parenthèses ne servent à rien !
    Désolé, mais comme je l'ai dit, je suis loin d'être un expert en SQL, et ce code est un copier-coller de la requête générée par Infomaker 8. J'irai lui tapper sur les doigts.

    Merci beaucoup pour votre aide, qui s'avère très précieuse. Je vais essayer de l'appliquer à mon problème, et en tout cas cela m'aura appris des choses. Merci encore.


    EDIT : SQLview me renvoit une erreur à la ligne 26. Voici le code :

    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
    SELECT Avg(SOMME_DURE) AS MOYENNE 
     
    FROM   (SELECT G.cd_oper,
           G.des,
           A.cd_obi.art,
           sum(E.dur_evt) AS SOMME_DUREE,
           O.dte_hre_fin_prev,
           O.cd_etat_ordfab,
           G.no_int_ord_fab
     
    FROM   obi.evtate E
           INNER JOIN obi.ORDFAB_gamope G
                 ON     E.no_ste           = G.no_ste
                    AND E.no_int_ord_fab   = G.no_int_ord_fab
                    AND E.no_int_opegam_obi.ordfab = GF.no_int_opegam_obi.ordfab
           INNER JOIN OBI.ORDFAB  O
                 ON     G.no_int_ord_fab = O.no_int_ord_fab
                    AND G.no_ste = O.no_ste
           INNER JOIN obi.art A
                 ON     O.no_ste = A.no_ste
                    AND O.no_int_ art = A.no_int_ art
     
    GROUP  BY G.cd_oper, G.des, A.cd_ art, O.dte_hre_fin_prev,
              O.cd_etat_ordfab, G.no_int_ord_fab) T
     
    GROUP BY T.MOYENNE;
    Je pense avoir repris comme il faut la structure présentée dans le post précédent. D'où pourrait venir l'erreur svp ?


  7. #7
    Membre actif
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Points : 206
    Points
    206
    Par défaut
    je ne connais pas sybase mais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GROUP BY T.MOYENNE
    "T" n'a rien à voir ici.

    GROUP BY MOYENNE


    A+

  8. #8
    Futur Membre du Club
    Inscrit en
    Août 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Même sans le T, l'erreur est identique.

    Merci de votre temps.

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Tu ne peux pas faire une GROUP BY sur le champ qui est le résultat de tes opérations : SQLPro avais mis un GROUP BY T.??? en fin de requête en supposant que dans ton SELECT, tu voudrais faire apparaître d'autres champs sur lesquels tu aurais pu vouloir faire ce regroupement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT AVG(SOMME_DURE), ??? 
    ...
    GROUP BY T. ???
    => par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT AVG(SOMME_DURE), cd_oper
    ...
    GROUP BY T.cd_oper
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  10. #10
    Futur Membre du Club
    Inscrit en
    Août 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    J'ai essayé avec l'exemple ci-dessus (T.cd_oper), j'ai toujours une erreur (différente) :

    14:15:44 : Ligne 1 : Erreur SQL générale.
    [Sybase][ODBC Driver]Syntax error: near 'SELECT' in ...FROM ([SELECT] G.cd_oper, ...
    ***

  11. #11
    Membre actif
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Points : 206
    Points
    206
    Par défaut
    Désolé ma réponse précédente navait aucun sens


    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
    SELECT Avg(SOMME_DURE) AS MOYENNE 
     
    FROM   (SELECT G.cd_oper, 
           G.des, 
           A.cd_obi.art, 
           sum(E.dur_evt) AS SOMME_DUREE, 
           O.dte_hre_fin_prev, 
           O.cd_etat_ordfab, 
           G.no_int_ord_fab 
     
    FROM   obi.evtate E 
           INNER JOIN obi.ORDFAB_gamope G 
                 ON     E.no_ste           = G.no_ste 
                    AND E.no_int_ord_fab   = G.no_int_ord_fab 
                    AND E.no_int_opegam_obi.ordfab = GF.no_int_opegam_obi.ordfab 
           INNER JOIN OBI.ORDFAB  O 
                 ON     G.no_int_ord_fab = O.no_int_ord_fab 
                    AND G.no_ste = O.no_ste 
           INNER JOIN obi.art A 
                 ON     O.no_ste = A.no_ste 
                    AND O.no_int_ art = A.no_int_ art 
     
    GROUP  BY G.cd_oper, G.des, A.cd_ art, O.dte_hre_fin_prev, 
              O.cd_etat_ordfab, G.no_int_ord_fab) T 
     
    GROUP BY T.MOYENNE;
    Je constate que les champs de ton 2eme Select ne correspondent dans le group by.

    en faisant ceci peut être ça marchera

    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
    SELECT T.cd_oper,Avg(SOMME_DURE) AS MOYENNE 
     
    FROM   (SELECT G.cd_oper, 
           G.des, 
           A.cd_obi.art, 
           sum(E.dur_evt) AS SOMME_DUREE, 
           O.dte_hre_fin_prev, 
           O.cd_etat_ordfab, 
           G.no_int_ord_fab 
     
    FROM   obi.evtate E 
           INNER JOIN obi.ORDFAB_gamope G 
                 ON     E.no_ste           = G.no_ste 
                    AND E.no_int_ord_fab   = G.no_int_ord_fab 
                    AND E.no_int_opegam_obi.ordfab = GF.no_int_opegam_obi.ordfab 
           INNER JOIN OBI.ORDFAB  O 
                 ON     G.no_int_ord_fab = O.no_int_ord_fab 
                    AND G.no_ste = O.no_ste 
           INNER JOIN obi.art A 
                 ON     O.no_ste = A.no_ste 
                    AND O.no_int_ art = A.no_int_ art 
     
    GROUP  BY G.cd_oper, 
           G.des, 
           A.cd_obi.art, 
           O.dte_hre_fin_prev, 
           O.cd_etat_ordfab, 
           G.no_int_ord_fab 
    ) T 
     
    GROUP BY T.cd_oper;
    A+

  12. #12
    Futur Membre du Club
    Inscrit en
    Août 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Si je ne me trompe pas, ce que tu me proposes revient à ce que Xo m'avait proposé. En tout cas, j'ai toujours la même erreur. Merci quand même de t'intéresser à mon problème. ^^

  13. #13
    Membre actif
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Points : 206
    Points
    206
    Par défaut
    Oui la même chose que XO avec une information complémentaire est
    que
    Je constate que les champs de ton 2eme Select ne correspondent dans le group by.
    et je vois que dans ta requête le Select a pour champ A.cd_obi.art, et dans le group by on trouve A.cd_ art

    Peut être c'est une omission de ta part dans le post mais il fallait le signaler.on s'accroche à toute piste.

    A+

  14. #14
    Futur Membre du Club
    Inscrit en
    Août 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Oh oui exact, je n'avais pas fait attention à ça. Mais ce n'est qu'une erreur de copier-coller dans le post. Ce n'est pas de là que viens l'erreur. Bien vu quand même.

    Voici le code sans erreur de frappe (j'espère :-/) :

    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
    SELECT T.cd_oper,Avg(SOMME_DURE) AS MOYENNE
     
    FROM   (SELECT G.cd_oper,
           G.des,
           A.cd_art,
           sum(E.dur_evt) AS SOMME_DUREE,
           O.dte_hre_fin_prev,
           O.cd_etat_ordfab,
           G.no_int_ord_fab
     
    FROM   obi.evtate E
           INNER JOIN obi.ORDFAB_gamope G
                 ON     E.no_ste           = G.no_ste
                    AND E.no_int_ord_fab   = G.no_int_ord_fab
                    AND E.no_int_opegam_ordfab = G.no_int_opegam_ordfab
           INNER JOIN OBI.ORDFAB  O
                 ON     G.no_int_ord_fab = O.no_int_ord_fab
                    AND G.no_ste = O.no_ste
           INNER JOIN obi.art A
                 ON     O.no_ste = A.no_ste
                    AND O.no_int_ art = A.no_int_ art
     
    GROUP  BY G.cd_oper,
           G.des,
           A.cd_art,
           O.dte_hre_fin_prev,
           O.cd_etat_ordfab,
           G.no_int_ord_fab
    ) T
     
    GROUP BY T.cd_oper;

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

Discussions similaires

  1. Exception in component tAggregateRow (moyenne et somme sur BigDecimal)
    Par devkl dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 29/08/2011, 13h45
  2. [Vxi3] Problème de Moyenne de somme
    Par Julien59 dans le forum Webi
    Réponses: 4
    Dernier message: 19/05/2010, 14h58
  3. Moyenne et somme sur un champ type time
    Par neo.51 dans le forum Formules
    Réponses: 2
    Dernier message: 26/10/2007, 11h07
  4. Moyenne d'une somme
    Par fab dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 07/08/2006, 11h45
  5. cmt calculez la somme et la moyenne en access
    Par elhosni dans le forum Access
    Réponses: 4
    Dernier message: 31/10/2005, 21h07

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