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 :

[Oracle] Calcul de moyenne par module


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 130
    Points : 68
    Points
    68
    Par défaut [Oracle] Calcul de moyenne par module
    bonjour,
    voici ma table:
    create table table1 (
    MATRICULE number(9) not null,
    SECTION VARCHAR2(1) not null,
    MODULE1 VARCHAR2(5) not null,
    MODULE2 VARCHAR2(5) not null,
    MODULE3 VARCHAR2(5) not null,
    MODULE4 VARCHAR2(5) not null,
    constraint PK primary key (MATRICULE)
    )
    je voudrais savoir comment avoir pour chaque section,le module dont la moyenne est la plus basse.
    merci à vous

  2. #2
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    C'est pas tres conventionel, mais voici une réponse possible :

    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
    SELECT MIN (module),section
    FROM(SELECT module1 AS module,section
    FROM table1 a
    UNION
    SELECT module2 AS module,section
    FROM table1 b
    UNION
    SELECT module3 AS module,section
    FROM table1 c
    UNION
    SELECT module4 AS module,section
    FROM table1 d)
    GROUP BY section
    


    Attention car SECTION est un mot reservé ORACLE.
    Ceci dit en modifiant ton modele conceptuel, ce genre de requete serait beaucoup plus facile et optimisée...

    J'espere que ca peut t'aider
    Bon courage
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  3. #3
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 130
    Points : 68
    Points
    68
    Par défaut
    je ne vois pas ce que tu veux dire par table1 a,table1 b,table1 c,table1 d.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    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 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    ce sont des alias de table? Chaque table est renommé.

    Plus performante sera la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT MIN (module),"section"
    FROM(SELECT module1 AS module,"section"
    FROM table1 a
    UNION ALL
    SELECT module2 AS module,"section"
    FROM table1 b
    UNION ALL
    SELECT module3 AS module,"section"
    FROM table1 c
    UNION ALL
    SELECT module4 AS module,"section"
    FROM table1 d)
    GROUP BY "section" 
    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/ * * * * *

  5. #5
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 130
    Points : 68
    Points
    68
    Par défaut
    c'est pas exactement se que je veux.
    je repose autrement mon probleme:
    par exemple cette table:
    MATRICULE SECTION MOD1 MOD2 MOD3 MOD4
    ------------------------------------------------
    1 A 10 8 6 13
    2 A 12 9 7 10
    3 A 8 10 17 10
    4 B 12 12 12 12
    5 B 10 11 9 9
    6 B 10 8 12 12
    7 B 12 4 9 10
    8 C 9 13 15 12
    9 C 12 7 4 8
    10 C 9 7 5 9
    _____________________________________________
    je voudrais avoir pour chaque section, le module dont la la moyenne est la plus basse
    ex:
    pour la section A,c'est le module MOD2 qui a la moyenne la plus basse (c'est 9)
    je veux avoir un truc du genre:
    section module moyenne
    A MOD2 9
    B MOD2 8,75
    C MOD3 8

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    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 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    c'est faisable mais absolument imbitable du fait du modele de données particulièrement pourri !

    Poste au moins les CREATE TABLE et les INSERT en te conformant à ce post :
    http://www.developpez.net/forums/showthread.php?t=944
    cela nous permettra de te pondre la requête ... à chier !!!

    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/ * * * * *

  7. #7
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Profitons des caractéristiques d'ORACLE puisque c'est ton moteur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT SECTION, CASE Least(mod1,   mod2,   mod3,   mod4)
                         WHEN mod1 THEN 'MOD1'
                         WHEN mod2 THEN 'MOD2'
                         WHEN mod3 THEN 'MOD3'
                         ELSE 'MOD4'
                    END as Module, Least(mod1,   mod2,   mod3,   mod4) as Moyenne
    FROM (SELECT SECTION, AVG(mod1) AS mod1, AVG(mod2) AS mod2, AVG(mod3) AS mod3, AVG(mod4) AS mod4
          FROM dvp_avg
          GROUP BY SECTION);
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  8. #8
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 130
    Points : 68
    Points
    68
    Par défaut
    j'ai écri la requete mot à mot,mé elle ne s'execute pas!!
    j'ai le msg d'erreur suivant:
    ERREUR à la ligne 1:
    ORA-00923: Mot clé FROM absent à l'emplacement prévu
    je peux savoir c'est quoi le probleme???

    AJOUT - SQLpro !!!

    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
    create table TABLE1 (
    MATRICULE number(9) not null,
    SECTION VARCHAR2(1) not null,
    MODULE1 NUMBER(5) not null,
    MODULE2 NUMBER(5) not null,
    MODULE3 NUMBER(5) not null,
    MODULE4 NUMBER(5) not null,
    constraint PK primary key (MATRICULE)
    )
     
    INSERT INTO TABLE1 VALUES('1','A',10,8,6,13);
    INSERT INTO TABLE1 VALUES('2','A',12,9,7,10);
    INSERT INTO TABLE1 VALUES('3','A',8,10,17,10);
    INSERT INTO TABLE1 VALUES('4','B',12,12,12,12);
    INSERT INTO TABLE1 VALUES('6','B',10,11,9,9);
    INSERT INTO TABLE1 VALUES('9','B',10,8,12,12);
    INSERT INTO TABLE1 VALUES('11','B',12,4,9,10);
    INSERT INTO TABLE1 VALUES('12','C',9,13,15,12);
    INSERT INTO TABLE1 VALUES('10','C',12,7,4,8);
    INSERT INTO TABLE1 VALUES('5','C',9,7,5,9);
    je voudrais avoir pour chaque section, le module dont la la moyenne est la plus basse
    ex:
    pour la section A,c'est le module MOD2 qui a la moyenne la plus basse (c'est 9)
    je veux avoir un truc du genre:
    section module moyenne
    A MOD2 9
    B MOD2 8,75
    C MOD3 8

  9. #9
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    La requête que j'ai postée est testée sous ORACLE 9i.
    Quelle version utilises-tu ? Vérifie que Least et CASE (que l'on peut remplacer par DECODE) sont acceptés avec ta version.

    Fait un copier-coller de ta requête.
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  10. #10
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    En plus, change le type de tes colonnes MODULEx car un AVG sur une chaine de caracteres, ca peut planter facilement... Je te conseillerai de mettre des MIN plutot que des AVG.Bon courage
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  11. #11
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par Yanika_bzh
    En plus, change le type de tes colonnes MODULEx car un AVG sur une chaine de caracteres, ca peut planter facilement...
    J'avoue, dans mes tests j'ai déclaré ces colonnes INTEGER
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    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 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    La solution :

    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
    SELECT TTT.*
    FROM   (SELECT "SECTION", MIN(MOYENNE) AS MIN_MOYENNE
            FROM   (SELECT "SECTION", AVG(MODULE1) AS MOYENNE, 'MODULE1' AS 'MODULE'
                    FROM   TABLE1
                    GROUP  BY "SECTION"
                    UNION  ALL
                    SELECT "SECTION", AVG(MODULE2) AS MOYENNE, 'MODULE2' AS 'MODULE'
                    FROM   TABLE1
                    GROUP  BY "SECTION"
                    UNION  ALL
                    SELECT "SECTION", AVG(MODULE3) AS MOYENNE, 'MODULE3' AS 'MODULE'
                    FROM   TABLE1
                    GROUP  BY "SECTION"
                    UNION  ALL
                    SELECT "SECTION", AVG(MODULE4) AS MOYENNE, 'MODULE4' AS 'MODULE'
                    FROM   TABLE1
                    GROUP  BY "SECTION") AS T
            GROUP BY "SECTION") TT
           INNER JOIN (SELECT "SECTION", AVG(MODULE1) AS MOYENNE, 'MODULE1' AS 'MODULE'
                       FROM   TABLE1
                       GROUP  BY "SECTION"
                       UNION  ALL
                       SELECT "SECTION", AVG(MODULE2) AS MOYENNE, 'MODULE2' AS 'MODULE'
                       FROM   TABLE1
                       GROUP  BY "SECTION"
                       UNION  ALL
                       SELECT "SECTION", AVG(MODULE3) AS MOYENNE, 'MODULE3' AS 'MODULE'
                       FROM   TABLE1
                       GROUP  BY "SECTION"
                       UNION  ALL
                       SELECT "SECTION", AVG(MODULE4) AS MOYENNE, 'MODULE4' AS 'MODULE'
                       FROM   TABLE1
                       GROUP  BY "SECTION") AS TTT
     
                 ON     TT."SECTION" = TTT."SECTION"
                    AND TT.MIN_MOYENNE = TTT.MOYENNE
    Requête imbitable !!!!

    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/ * * * * *

  13. #13
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 130
    Points : 68
    Points
    68
    Par défaut
    j'utilise la version 8i,et je crois qu'elle n'accepte pas les case,least.
    Comment je peux modifier la requete avec DECODE?

  14. #14
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    avec les decodes cela va etre encore pire comme usine a gaz !!!
    il te faudra des decode imbriqués avec la fonction SIGN, ca va etre une horreur !!!

    Le mieux, je pense c'est de revoir ton modele si tu peux.
    Sinon, je te donne une requete, elle aussi horrible (mais bon !!!).

    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
     
     
    
    SELECT a.module, a.section, a.n
    FROM (SELECT MIN (b.module)AS module, b.section, b.n
    FROM (SELECT module1 AS module,section,'Mod 1' AS n
    FROM table1 a
    UNION ALL SELECT module2 AS module,section,'Mod 2' AS n FROM table1 b UNION ALL SELECT module3 AS module,section,'Mod 3' AS n FROM table1 c UNION ALL SELECT module4 AS module,section,'Mod 4' AS n FROM table1 d) b GROUP BY b.section, b.n) a,
    (SELECT MIN (b.module)AS module, b.section
    FROM(SELECT module1 AS module,section
    FROM table1 a UNION ALL SELECT module2 AS module,section FROM table1 b UNION ALL SELECT module3 AS module,section FROM table1 c UNION ALL SELECT module4 AS module,section
    FROM table1 d) b GROUP BY b.section) c
    WHERE c.section= a.section AND c.module = a.module
    C'est tout ce que je peux faire pour toi en l'etat actuel des choses.
    Bien sur, cette requete aura d'horribles performances et je plains tes collegues qui passeront apres sur ce code

    Bon courage
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  15. #15
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    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 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    Encore une fois la brillante démonstration que modèle de merde = requête de merde !

    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/ * * * * *

Discussions similaires

  1. [XL-2003] Macro : Calcul de moyennes par semaine
    Par AsylumPan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 09/10/2014, 11h31
  2. [WD17] calcul de moyenne par ligne
    Par stefano dans le forum WinDev
    Réponses: 11
    Dernier message: 28/06/2014, 01h37
  3. [XL-2010] calcul de moyenne par ligne
    Par le_normand dans le forum Excel
    Réponses: 2
    Dernier message: 08/11/2013, 19h46
  4. Calculer la moyenne par intervalle de 5 minutes
    Par nngoned dans le forum Requêtes
    Réponses: 2
    Dernier message: 16/07/2013, 15h37
  5. Réponses: 2
    Dernier message: 13/02/2007, 19h02

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