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 sur 4 champ d'un meme table


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 38
    Par défaut moyenne sur 4 champ d'un meme table
    bonjour,
    voila mon code SQL pour une table de note:francais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE TABLE francais (
        no_eleve 					int(11)  unsigned     NOT NULL,
        note_francais_1   			numeric (2,1)		  default NULL,
        note_francais_2   			numeric (2,1)		  default NULL,
    	note_francais_3   			numeric (2,1)		  default NULL,
    	note_francais_4   			numeric (2,1)		  default NULL,
        FOREIGN KEY (no_eleve) REFERENCES eleve (no_eleve)
    	ON DELETE RESTRICT ON UPDATE CASCADE,
    	UNIQUE INDEX(no_eleve)
    )TYPE=INNODB;
    j'aimerai avoir la moyenne des notes:note_francais_1 ,note_francais_2,note_francais_3,note_francais_4

    j'ai fait la requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT AVG(note_francais_1,note_francais_2,note_francais_3,note_francais_4) FROM francais WHERE no_eleve=1;
    et sa marche pas mais j'aimerai savoir pourquoi
    merci

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 999
    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 999
    Billets dans le blog
    6
    Par défaut
    Un agrégat statistique ne prend qu'une seule colonne en argument. Votre base étant mal modélisée (vous vous servez de votre SGBDR à la manière d'un tableur ce qui est stupide), il faut faire une requête tordue :

    Soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT AVG((note_francais_1 + note_francais_2 + note_francais_3 + note_francais_4 ) / 4 ) 
    FROM   francais 
    WHERE  no_eleve=1
    soit :

    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
    SELECT AVG(NOTE)
    FROM   (SELECT AVG(note_francais_1)
            FROM   francais 
            WHERE  no_eleve=1
            UNION  ALL
            SELECT AVG(note_francais_2)
            FROM   francais 
            WHERE  no_eleve=1
            UNION ALL         
            SELECT AVG(note_francais_3)
            FROM   francais 
            WHERE  no_eleve=1
            UNION ALL 
            SELECT AVG(note_francais_4)
            FROM   francais 
            WHERE  no_eleve=1) AS T
    Si vous aviez modélisée proprement votre base de données en respectant les formes normales, 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
    CREATE TABLE T_ELEVE_ELV
    (ELV_ID      INT NOT NULL PRIMARY KEY
     ELV_NOM     VARCHAR(32))
     
    CREATE TABLE T_MATIERE_MTR 
    (MTR_ID      INT NOT NULL PRIMARY KEY,
     MTR_LIBELLE VARCHAR(32))
     
    CREATE TABLE T_NOTE_NOT
    (NOT_ID           INT NOT NULL PRIMARY KEY,
     NOT_DATE_INTERRO DATE NOT NULL
     ELV_ID           INT NOT NULL FOREIGN KEY REFERENCES T_ELEVE_ELV (ELV_ID),
     MTR_ID           INT NOT NULL FOREIGN KEY REFERENCES T_MATIERE_MTR (MTR_ID),
     NOT_NOTE         FLOAT NOT NULL)
    Votre requête se serait écrite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT AVG(NOT_NOTE)
    FROM   T_NOTE_NOT AS N
           INNER JOIN T_MATIERE_MTR AS M
                 ON N.MTR_ID = M.MTR_ID
           INNER JOIN T_ELEVE_ELV AS E
                 ON M.ELV_ID = E.ELV_ID
    WHERE  ELV_ID = 1
    Et si en outre vous aviez utilisé une vue comme les règles de l'art des bases de données l'exige :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE VIEW V_NOTE_ELEVE_NLV
    AS
    SELECT N.*, E.*
    FROM   T_NOTE_NOT AS N
           INNER JOIN T_MATIERE_MTR AS M
                 ON N.MTR_ID = M.MTR_ID
           INNER JOIN T_ELEVE_ELV AS E
                 ON M.ELV_ID = E.ELV_ID;
    alors la requête est encore plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT AVG(NOT_NOTE)
    FROM   V_NOTE_ELEVE_NLV
    WHERE  ELV_ID = 1
    A +

    PS : mon site web comme mes bouquins peuvent vous permettre de vous former aux bases de données relationnelles comme au langage SQL !
    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/ * * * * *

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 38
    Par défaut
    merci de ta réponse.
    pour ce qui est la base en générale tu as raison elle est mal modélisé mais bon j'essayerai de la refaire en étudiant mieu les relations entre les tables
    parcontre j'ai une question par rapport a ce code que vous avez écrit
    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
    SELECT AVG(NOTE)
    FROM   (SELECT AVG(note_francais_1)
            FROM   francais 
            WHERE  no_eleve=1
            UNION  ALL
            SELECT AVG(note_francais_2)
            FROM   francais 
            WHERE  no_eleve=1
            UNION ALL         
            SELECT AVG(note_francais_3)
            FROM   francais 
            WHERE  no_eleve=1
            UNION ALL 
            SELECT AVG(note_francais_4)
            FROM   francais 
            WHERE  no_eleve=1) AS T
    SELECT AVG(NOTE)????
    j'ai pas bien compris.
    de plus si j'utilise le code tordue comme vous avez di (LOL):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT AVG((note_francais_1 + note_francais_2 + note_francais_3 + note_francais_4 ) / 4 ) 
    FROM   francais 
    WHERE  no_eleve=1
    je peux pas vraiment l'utiliser car il ya des champs qui peuvent être a null

Discussions similaires

  1. duplique données d'un champs dans un autre champs de la meme table
    Par alexkickstand dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/05/2007, 23h01
  2. comment additionner des champs appartenant à la meme table
    Par VIRGINIE87 dans le forum Langage SQL
    Réponses: 25
    Dernier message: 12/04/2007, 14h40
  3. Réponses: 6
    Dernier message: 12/09/2006, 08h42
  4. Affectation sur un champ vide d'une table Access
    Par kurkaine dans le forum C++Builder
    Réponses: 2
    Dernier message: 25/11/2005, 09h14
  5. Update champ avec le meme champ de la meme table
    Par Baquardie dans le forum Langage SQL
    Réponses: 7
    Dernier message: 04/06/2004, 11h17

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