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

SQL Firebird Discussion :

Requete pour calcul de moyenne avec semestre


Sujet :

SQL Firebird

  1. #1
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 675
    Points : 952
    Points
    952
    Par défaut Requete pour calcul de moyenne avec semestre
    Bonjour à tous

    Pour entreprendre la compréhension (essayer de calculer les moyennes) d'une table dont voici la forme :

    T_NOTES (id_note,num_etudiant,nom_matière,an_sconote,note1,note2,noteexam,moymat,semestre)

    voici aussi quelques données :
    Nom : Capture.JPG
Affichages : 4177
Taille : 80,9 Ko

    Mon inquiétude c'est de sortir :
    1 - La moyenne par semestre
    2 - et la moyenne générale = (la moyenne du semestre 1 + moyenne du semestre 2)/2

    Merci de m'aiguiller pour résoudre ce problème !

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    comme il n'est demandé qu'un "aiguillage" je répondrai par les mots clés Aggregate Functions et GROUP BY

    pour ce qui est de l'inquiétude moyenne par semestre et moyenne générale, il n'est pas vraiment indiqué si elles doivent être sorties ensemble ou séparément, mais si c'est ensemble le mot clé UNION devrait "aiguiller"

    enfin je pense que le problème n'est pas totalement exposé, ne serait-ce point les moyennes des élèves par semestre plutôt que celui des semestres ?

    Avec ces informations on peut s'attendre a une première requête
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    Et le choix des notes en colonnes (note_1, note_2) ne va pas faciliter les choses . Rien de rédhibitoire en soi, mais en tout cas pas de possibilité d'une 3eme note ....
    Merci d'ajouter un sur les tags qui vous ont aidé

  4. #4
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 675
    Points : 952
    Points
    952
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Bonjour,
    comme il n'est demandé qu'un "aiguillage" je répondrai par les mots clés Aggregate Functions et GROUP BY
    pour ce qui est de l'inquiétude moyenne par semestre et moyenne générale, il n'est pas vraiment indiqué si elles doivent être sorties ensemble ou séparément, mais si c'est ensemble le mot clé UNION devrait "aiguiller"
    Ok aiguiller ? aide en faite pour un début de requête !

    Citation Envoyé par SergioMaster Voir le message
    enfin je pense que le problème n'est pas totalement exposé, ne serait-ce point les moyennes des élèves par semestre plutôt que celui des semestres ?

    Avec ces informations on peut s'attendre a une première requête
    c'est bien ça :
    la moyenne élève par semestre
    la moyenne élève pour les deux semestres

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Quelque chose comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT NUM_ETUDIANT,0,SEMESTRE,AVG(MOYMAT) AS MOYENNE FROM T_NOTES 
    GROUP BY 1,2,3
    UNION NUM_ETUDIANT,1,'ANNEE',AVG(MOYMAT) FROM T_NOTES
    GROUP BY 1,2,3
    non testé, car il aurait beaucoup mieux de nous fournir un script de création de table et d'insertion d'enregistrements
    et établi sur l'hypothèse que MOYMAT est la moyenne des 3 notes (note1,note2,noteExam) hypothèse impossible à vérifier car les valeurs proposées dans l'exemple
    sont fausses : ne correspondent ni au calcul note1+note2+noteexam/3 ni à (note1+note2+(noteexam*2))/4 << coeff 2 pour examen
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 675
    Points : 952
    Points
    952
    Par défaut
    Oui les données dans la figure sont fausses, en effet MOYMAT correspond a un calcul des 3 notes dont voici la formule : MOYMAT=((NOTE_1+NOTE_2)/2)*0,4+(NOTE_EXAM*0,6)
    Je vais commencer avec la requête proposée revenir en cas de difficultés. Merci

  7. #7
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 675
    Points : 952
    Points
    952
    Par défaut
    Bonjour
    J'ai essayer d'adapter la requête mais j'ai des erreurs :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT num_etudiant,0,SEMESTRE, AVG((note1+note2)/2 * 0.4 + (noteexam * 0.6)) AS MOYENNE FROM T_NOTES
    GROUP BY 1,2,3
    UNION num_etudiant,1, an_sconote, AVG((note1+note2)/2 * 0.4 + (noteexam * 0.6)) FROM T_NOTES
    GROUP BY 1,2,3

    Erreur :

    Invalid token.
    Dynamic SQL Error.
    SQL error code = -104.
    Token unknown - line 3, column 7.
    num_etudiant.
    Merci

  8. #8
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 675
    Points : 952
    Points
    952
    Par défaut
    Bonjour

    J'ai essayer de décortiquer un peu la requête (avec exécution), et cette partie

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT num_etudiant,0,SEMESTRE, AVG((note1+note2)/2 * 0.4 + (noteexam * 0.6)) AS MOYENNE FROM T_NOTES
    GROUP BY 1,2,3

    me donne pour un num_etudiant deux lignes :
    semestre 1 avec la moyenne
    semestre 2 avec la moyenne

    Je ne cherche plus qu'a faire la moyenne de ces deux lignes pour avoir avoir la moyenne général.

    Je ne vois pas comment procéder

    Merci

  9. #9
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 675
    Points : 952
    Points
    952
    Par défaut
    nouvelle essai avec la requête :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT num_etudiant,0,SEMESTRE, AVG((note1+note2)/2 * 0.4 + (noteexam * 0.6)) AS MOYENNE FROM T_NOTES
    GROUP BY 1,2,3
    UNION
    SELECT num_etudiant,1, an_sconote, AVG((note1+note2)/2 * 0.4 + (noteexam * 0.6)) FROM T_NOTES
    GROUP BY 1,2,3



    Invalid token.
    Dynamic SQL Error.
    SQL error code = -104.
    Token unknown - line 5, column 74.
    FROM.
    Je cherche toujours

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonjour
    Citation Envoyé par devalender Voir le message
    J'ai essayer d'adapter la requête mais j'ai des erreurs :
    OOPS , j'avais oublié un SELECT après UNION
    encore une fois je rappelle que j'ai écris ceci à la volée

    Citation Envoyé par sergiomaster
    il aurait beaucoup mieux de nous fournir un script de création de table et d'insertion d'enregistrements
    et ceci aussi car à me relire il manque quelque chose
    il aurait été beaucoup mieux de nous fournir un script de création de table et d'insertion d'enregistrements

    Du coup j'ai un doute sur les group by (est-il possible de faire une union sur les deux select ?)
    Qu'à cela ne tienne, il est toujours possible d'utiliser les CTE !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    WITH A AS (SELECT num_etudiant, an_sconote, AVG((note1+note2)/2 * 0.4 + (noteexam * 0.6)) AS MOYENNE FROM T_NOTES GROUP BY 1,2),
            S AS  (SELECT num_etudiant,SEMESTRE, AVG((note1+note2)/2 * 0.4 + (noteexam * 0.6)) AS MOYENNE FROM T_NOTES GROUP BY 1,2)
     
    SELECT NUM_ETUDIANT,0,SEMESTRE,MOYENNE FROM S
    UNION
    SELECT NUM_ETUDIANT,1,AN_SCONOTE,MOYENNE FROM A  
    ORDER BY 1,2 -- précaution peut être inutile
    j'ai fait le test sur 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
    CREATE TABLE BRANDS
    (
      CODE Integer NOT NULL,
      NOM Varchar(15),
      SCORE Smallint,
      PAYS Char(1),
      CONSTRAINT PK_BRAND PRIMARY KEY (CODE)
    );
    INSERT INTO BRANDS (CODE, NOM, SCORE, PAYS) VALUES ('1', 'Audi', '10', 'D');
    INSERT INTO BRANDS (CODE, NOM, SCORE, PAYS) VALUES ('2', 'BMW', '5', 'D');
    INSERT INTO BRANDS (CODE, NOM, SCORE, PAYS) VALUES ('3', 'BMW', '5', 'D');
    INSERT INTO BRANDS (CODE, NOM, SCORE, PAYS) VALUES ('4', 'BMW', '5', 'D');
    INSERT INTO BRANDS (CODE, NOM, SCORE, PAYS) VALUES ('5', 'VW', '3', 'D');
    INSERT INTO BRANDS (CODE, NOM, SCORE, PAYS) VALUES ('6', 'VW', '7', 'D');
    INSERT INTO BRANDS (CODE, NOM, SCORE, PAYS) VALUES ('7', 'VW', '5', 'D');
    INSERT INTO BRANDS (CODE, NOM, SCORE, PAYS) VALUES ('8', 'Audi', '2', 'D');
    INSERT INTO BRANDS (CODE, NOM, SCORE, PAYS) VALUES ('9', 'Renault', '14', 'F');
    INSERT INTO BRANDS (CODE, NOM, SCORE, PAYS) VALUES ('10', 'Citroen', '2', 'F');
     
    WITH S AS (SELECT 1 AS N,PAYS,AVG(CAST(SCORE AS NUMERIC(5,3))) AS MOY FROM BRANDS GROUP BY 1,2), -- MOYENNE PAR PAYS
         m AS (SELECT 0 AS N, NOM,PAYS, AVG(CAST(SCORE AS NUMERIC(5,3))) AS MOY -- MOYENNE PAR MARQUE
    FROM BRANDS GROUP BY 1,2,3)
     
    SELECT PAYS,N,NOM,MOY FROM M
    UNION
    SELECT PAYS,N,'',MOY FROM S
    et obtenu le résultat suivant
    D 0 Audi 6.000
    D 0 BMW 5.000
    D 0 VW 5.000
    D 1 5.250
    F 0 Citroen 2.000
    F 0 Renault 14.000
    F 1 8.000
    notable : la moyenne totale de D (pour Allemagne) , c'est la moyenne des scores 5.25 et non la moyenne des moyennes par marques qui aurait donné 5.333
    que j'aurais pu obtenir ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WITH m AS (SELECT 0 AS N, NOM,PAYS, AVG(CAST(SCORE AS NUMERIC(5,3))) AS MOY FROM BRANDS GROUP BY 1,2,3),  -- MOYENNE PAR MARQUE
         S AS (SELECT 1 AS N,PAYS,AVG(MOY) AS MOY FROM M GROUP BY 1,2)              -- CTE sur CTE MOYENNE SUR MOYENNE PAR MARQUE
     
    SELECT PAYS,N,NOM,MOY FROM M
    UNION
    SELECT PAYS,N,'',MOY FROM S
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  11. #11
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 377
    Points : 19 048
    Points
    19 048
    Par défaut
    Salut à tous.

    Bon, j'ai fait l'exercice et vous me direz si cela vous convient !

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    DROP   DATABASE;
    CREATE DATABASE '..\Data\Base.fdb' page_size 4096 DEFAULT CHARACTER SET ISO8859_1;
     
    create table test (
    id_note        int          not null primary key,
    num_etudiant   int          not null,
    nom_matiere    char(10)     not null collate fr_fr,
    an_sconote     char(10)     not null collate fr_fr,
    note_1         decimal(5,2) not null,
    note_2         decimal(5,2) not null,
    noteexam       decimal(5,2) not null,
    moymat         decimal(5,2) not null,
    semestre       char(10)     not null collate fr_fr
    );
     
    insert into test (id_note,num_etudiant,nom_matiere,an_sconote,note_1,note_2,noteexam,moymat,semestre) values ( 1, 256, 'matière 1',  '2008-2009', 13.00, 12.00, 12.00, 0.00, 'semestre 1');
    insert into test (id_note,num_etudiant,nom_matiere,an_sconote,note_1,note_2,noteexam,moymat,semestre) values ( 2, 256, 'matière 2',  '2008-2009',  9.00,  8.00,  8.00, 0.00, 'semestre 1');
    insert into test (id_note,num_etudiant,nom_matiere,an_sconote,note_1,note_2,noteexam,moymat,semestre) values ( 3, 256, 'matière 3',  '2008-2009', 10.00,  5.50,  5.50, 0.00, 'semestre 1');
    insert into test (id_note,num_etudiant,nom_matiere,an_sconote,note_1,note_2,noteexam,moymat,semestre) values ( 4, 256, 'matière 4',  '2008-2009', 12.00,  9.00,  9.00, 0.00, 'semestre 1');
    insert into test (id_note,num_etudiant,nom_matiere,an_sconote,note_1,note_2,noteexam,moymat,semestre) values ( 5, 256, 'matière 5',  '2008-2009',  6.25, 13.50, 13.50, 0.00, 'semestre 1');
    insert into test (id_note,num_etudiant,nom_matiere,an_sconote,note_1,note_2,noteexam,moymat,semestre) values ( 6, 256, 'matière 6',  '2008-2009',  5.25, 12.50, 12.50, 0.00, 'semestre 1');
    insert into test (id_note,num_etudiant,nom_matiere,an_sconote,note_1,note_2,noteexam,moymat,semestre) values ( 7, 256, 'matière 7',  '2008-2009',  4.00, 17.00, 17.00, 0.00, 'semestre 1');
    insert into test (id_note,num_etudiant,nom_matiere,an_sconote,note_1,note_2,noteexam,moymat,semestre) values ( 8, 256, 'matière 8',  '2008-2009', 13.00, 10.00, 10.00, 0.00, 'semestre 1');
    insert into test (id_note,num_etudiant,nom_matiere,an_sconote,note_1,note_2,noteexam,moymat,semestre) values ( 9, 256, 'matière 9',  '2008-2009', 16.50, 16.50, 16.50, 0.00, 'semestre 2');
    insert into test (id_note,num_etudiant,nom_matiere,an_sconote,note_1,note_2,noteexam,moymat,semestre) values (10, 256, 'matière 10', '2008-2009', 13.00, 13.00, 13.00, 0.00, 'semestre 2');
    insert into test (id_note,num_etudiant,nom_matiere,an_sconote,note_1,note_2,noteexam,moymat,semestre) values (11, 256, 'matière 11', '2008-2009',  9.00,  9.00,  9.00, 0.00, 'semestre 2');
    insert into test (id_note,num_etudiant,nom_matiere,an_sconote,note_1,note_2,noteexam,moymat,semestre) values (12, 256, 'matière 12', '2008-2009', 10.00, 10.00, 10.00, 0.00, 'semestre 2');
    insert into test (id_note,num_etudiant,nom_matiere,an_sconote,note_1,note_2,noteexam,moymat,semestre) values (13, 256, 'matière 13', '2008-2009', 12.00, 12.00, 12.00, 0.00, 'semestre 2');
    insert into test (id_note,num_etudiant,nom_matiere,an_sconote,note_1,note_2,noteexam,moymat,semestre) values (14, 256, 'matière 14', '2008-2009',  6.25,  6.25,  6.25, 0.00, 'semestre 2');
    insert into test (id_note,num_etudiant,nom_matiere,an_sconote,note_1,note_2,noteexam,moymat,semestre) values (15, 256, 'matière 15', '2008-2009',  5.25,  5.25,  5.25, 0.00, 'semestre 2');
     
    select * from test;
     
         ID_NOTE NUM_ETUDIANT NOM_MATIERE AN_SCONOTE       NOTE_1       NOTE_2     NOTEEXAM       MOYMAT SEMESTRE
    ============ ============ =========== ========== ============ ============ ============ ============ ==========
               1          256 matière 1   2008-2009         13.00        12.00        12.00         0.00 semestre 1
               2          256 matière 2   2008-2009          9.00         8.00         8.00         0.00 semestre 1
               3          256 matière 3   2008-2009         10.00         5.50         5.50         0.00 semestre 1
               4          256 matière 4   2008-2009         12.00         9.00         9.00         0.00 semestre 1
               5          256 matière 5   2008-2009          6.25        13.50        13.50         0.00 semestre 1
               6          256 matière 6   2008-2009          5.25        12.50        12.50         0.00 semestre 1
               7          256 matière 7   2008-2009          4.00        17.00        17.00         0.00 semestre 1
               8          256 matière 8   2008-2009         13.00        10.00        10.00         0.00 semestre 1
               9          256 matière 9   2008-2009         16.50        16.50        16.50         0.00 semestre 2
              10          256 matière 10  2008-2009         13.00        13.00        13.00         0.00 semestre 2
              11          256 matière 11  2008-2009          9.00         9.00         9.00         0.00 semestre 2
              12          256 matière 12  2008-2009         10.00        10.00        10.00         0.00 semestre 2
              13          256 matière 13  2008-2009         12.00        12.00        12.00         0.00 semestre 2
              14          256 matière 14  2008-2009          6.25         6.25         6.25         0.00 semestre 2
              15          256 matière 15  2008-2009          5.25         5.25         5.25         0.00 semestre 2
     
     
    update test set moymat = (note_1 + note_2) * 0.2 + noteexam * 0.6;
     
    select * from test;
     
         ID_NOTE NUM_ETUDIANT NOM_MATIERE AN_SCONOTE       NOTE_1       NOTE_2     NOTEEXAM       MOYMAT SEMESTRE
    ============ ============ =========== ========== ============ ============ ============ ============ ==========
               1          256 matière 1   2008-2009         13.00        12.00        12.00        12.20 semestre 1
               2          256 matière 2   2008-2009          9.00         8.00         8.00         8.20 semestre 1
               3          256 matière 3   2008-2009         10.00         5.50         5.50         6.40 semestre 1
               4          256 matière 4   2008-2009         12.00         9.00         9.00         9.60 semestre 1
               5          256 matière 5   2008-2009          6.25        13.50        13.50        12.05 semestre 1
               6          256 matière 6   2008-2009          5.25        12.50        12.50        11.05 semestre 1
               7          256 matière 7   2008-2009          4.00        17.00        17.00        14.40 semestre 1
               8          256 matière 8   2008-2009         13.00        10.00        10.00        10.60 semestre 1
               9          256 matière 9   2008-2009         16.50        16.50        16.50        16.50 semestre 2
              10          256 matière 10  2008-2009         13.00        13.00        13.00        13.00 semestre 2
              11          256 matière 11  2008-2009          9.00         9.00         9.00         9.00 semestre 2
              12          256 matière 12  2008-2009         10.00        10.00        10.00        10.00 semestre 2
              13          256 matière 13  2008-2009         12.00        12.00        12.00        12.00 semestre 2
              14          256 matière 14  2008-2009          6.25         6.25         6.25         6.25 semestre 2
              15          256 matière 15  2008-2009          5.25         5.25         5.25         5.25 semestre 2
     
     
    select semestre, sum(moymat) / count(*)
    from test
    group by semestre;
     
    SEMESTRE                  DIVIDE
    ========== =====================
    semestre 1                 10.56
    semestre 2                 10.28
     
     
     
    select 'general' as moyenne, sum(moymat) / count(*)
    from test;
     
    MOYENNE                DIVIDE
    ======= =====================
    general                 10.43
     
     
    exit;
     
    Appuyez sur une touche pour continuer...
    Je n'ai pas tenu compte des arrondis.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  12. #12
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 675
    Points : 952
    Points
    952
    Par défaut
    Merci pour toutes ces reponses. j'ai commencer par tester celui avec les CTE :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    WITH A AS (SELECT num_etudiant, an_sconote, AVG((note1+note2)/2 * 0.4 + (noteexam * 0.6)) AS MOYENNE FROM T_NOTES GROUP BY 1,2,3),
            S AS  (SELECT num_etudiant,SEMESTRE, AVG((note1+note2)/2 * 0.4 + (noteexam * 0.6)) AS MOYENNE FROM T_NOTES GROUP BY 1,2,3)
     
    SELECT NUM_ETUDIANT,0,SEMESTRE,MOYENNE FROM S
    UNION
    SELECT NUM_ETUDIANT,1,AN_SCONOTE,MOYENNE FROM A  
    ORDER BY 1,2 /* -- précaution peut être inutile*/

    Mais j'ai message d'erreur :
    Invalid token.
    Dynamic SQL Error.
    SQL error code = -104.
    Cannot use an aggregate function in a GROUP BY clause.
    Merci

  13. #13
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 675
    Points : 952
    Points
    952
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Salut à tous.

    Bon, j'ai fait l'exercice et vous me direz si cela vous convient !
    Ici vous avez le résultat après deux requêtes ! Peut on l'avoir a partir d'une seule requête ?

    merci

  14. #14
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 377
    Points : 19 048
    Points
    19 048
    Par défaut
    Salut devalender.

    C'est pas bien compliqué à faire. Vous faites un union !
    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
    select semestre  as "classement", sum(moymat) / count(*) as "moyenne"
    from test
    group by semestre
    
    union
    
    select 'general' as "classement", sum(moymat) / count(*) as "moyenne"
    from test;
    
    classement               moyenne
    ========== =====================
    general                    10.43
    semestre 1                 10.56
    semestre 2                 10.28
    
    
    exit;
    
    Appuyez sur une touche pour continuer...
    Si vous êtes satisfait, mettez moi des +1 partout !

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  15. #15
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par devalender Voir le message
    j'ai commencer par tester celui avec les CTE :
    Mais j'ai message d'erreur
    et il ne t'es pas venu à l'idée de vérifier les group by ?

    Merci @Artemus pour avoir fourni le script de test
    une simple petite correction des deux CTE et j'obtiens
    256 0 semestre 1 10.562
    256 0 semestre 2 10.285
    256 1 2008-2009 10.433
    Je ne mettrai pas la correction elle est évidente, un peu de travail de ta part pour une fois
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  16. #16
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 377
    Points : 19 048
    Points
    19 048
    Par défaut
    Salut SergioMaster.

    Je ne suis pas très familier des CTE.
    Si j'ai bien compris, c'est comme si je créais une table temporaire.
    Dans ton exemple, il y a deux tables temporaires, la 'A' et la 'S'.
    Mais quel est l'intérêt de procéder comme dans ton exemple ?
    C'est juste pour faire des imbrications ? Ou bien, il y a une raison à cela ?

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  17. #17
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 675
    Points : 952
    Points
    952
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    et il ne t'es pas venu à l'idée de vérifier les group by ?

    Merci @Artemus pour avoir fourni le script de test
    une simple petite correction des deux CTE et j'obtiens

    Je ne mettrai pas la correction elle est évidente, un peu de travail de ta part pour une fois
    J'ai jamais utiliser de CTE donc la réponse pour vous est évidente mais pour moi je dois encore chercher je suis aussi pris par le temps.

    mais bon ! merci quand même !

  18. #18
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 675
    Points : 952
    Points
    952
    Par défaut
    Après correction de la clause Group By
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
     ....GROUP BY 1,2)...,
    tout est rentrer dans l'ordre et j'ai mon résultat attendu.
    Merci

  19. #19
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par Artemus24 Voir le message
    Je ne suis pas très familier des CTE.
    Si j'ai bien compris, c'est comme si je créais une table temporaire.
    c'est une des utilisations des CTE effectivement, la seule que je maitrise vraiment. C'est les CTE Recursives qui me posent encore des problèmes de compréhension (heureusement j'en ai rarement l'utilité).

    Dans ton exemple, il y a deux tables temporaires, la 'A' et la 'S'.
    Mais quel est l'intérêt de procéder comme dans ton exemple ?
    C'est juste pour faire des imbrications ? Ou bien, il y a une raison à cela ?
    le problème posé par devalender était d'obtenir une moyenne par élève, par semestre des notes d'un élève mais aussi d'avoir à la suite cette même moyenne sur l'année et ce dans un même ensemble résultat.
    voilà ma démarche,ne me demandant qu'un aiguillage : la réponse était évidente qui dit moyenne d'une table dit agrégat : AVG (même chose qu'un SUM / COUNT) et donc clause GROUP BY, qui dit deux résultats différents dit souvent UNION. Le truc, c'est (et à chaque fois je l'oublie) que l'on ne peut pas faire une union telle que je l'avais proposé dans mon second post , j'avais d'ailleurs indiqué :
    Quelque chose comme ça non testé
    et qui levait une erreur assez obscure
    Token unknown - line 5, column 74. FROM.
    Pour arriver à l'UNION il fallait donc passer par les CTE, la première A pour obtenir la moyenne Annuelle et la seconde S pour celle par semestre.
    J'ai ensuite rajouté les constantes 0 et 1 dans l'UNION pour distinguer le type de résultat obtenir le tri demandé 2 semestre puis l'année

    J'aurais pu mettre ces constantes dans les CTE mais il aurait fallu nommer les champs (comme dans mon exemple avec les marques de voiture) , c'est pour cela qu'après l'avoir écrit ainsi j'ai opté pour les mettre dans les SELECTs de L'UNION (en oubliant au passage de corriger les 2 CTEs) ce qui a levé l'erreur
    Cannot use an aggregate function in a GROUP BY clause.
    Voilà. Devalender aurait fait l'effort de fournir la structure de la table et un script d'insertion de données dés le départ il aurait sans doute eu la requête "toute cuite" ce qui en soit n'aurait pas été très "pédagogique"

    @devalender
    J'ai jamais utiliser de CTE donc la réponse pour vous est évidente
    il ne s'agissait pas de CTE mais des SELECT GROUP BY donc des requêtes à l'intérieur
    Réfléchir est la meilleure façon d'apprendre
    mais pour moi je dois encore chercher je suis aussi pris par le temps.
    j'ai l'impression d'avoir fait l'exercice d'un élève ton seul apport à mes propositions a été de mettre le calcul dans l'aggregat !

    d'ailleurs une petite note à propos de la moyenne générale par semestre (donc dans le cas de "l'exercice") : il aurait été plus efficace AMHA d'utiliser une colonne calculée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE TEST DROP MOYMAT;
    ALTER TABLE TEST ADD MOYMAT NUMERIC(5,2) COMPUTED BY ((note_1+note_2)/2 * 0.4 + (noteexam * 0.6));
    Quant à la remarque d'olivier :
    Rien de rédhibitoire en soi, mais en tout cas pas de possibilité d'une 3eme note ...
    elle est plus que justifiée, cette structure de données (une seule table T_NOTES) est plus que limite il aurait été préférable de trouver une structure du genre:

    ID_RECORD,ID_ELEVE,DATE (un semestre ça se calcule),ID_MATIERE,NOTE,COEFF (ou autre champ permettant de distinguer devoir d'examen)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  20. #20
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 377
    Points : 19 048
    Points
    19 048
    Par défaut
    Salut SergioMaster.

    Citation Envoyé par SergioMaster
    c'est une des utilisations des CTE effectivement, la seule que je maîtrise vraiment. C'est les CTE Recursives qui me posent encore des problèmes de compréhension (heureusement j'en ai rarement l'utilité).
    Quand une requête devient un peu trop complexe à mon gout, je décompose cette requête, en stockant un résultat intermédiaire dans une table temporaire.
    J'aurai tout aussi bien, pour la première requête (celle en interne), créer une View, et pour la seconde requête, travailler sur cette View.

    Si c'est juste pour décomposer un traitement en différente étape, je veux bien.
    Mais n'est-ce pas moins performant de procéder ainsi que d'écrire une requête classique ?

    Sinon, en MySql, quand le besoin s'en fait sentir, je vais créer une procédure stockée.
    J'ai toute la souplesse du développement et je peux l'utiliser comme un sous-programme.
    Encore que, quand j'étais administrateur DB2, il nous était interdit de faire des procédure stockée, car cela dégradait les performances du SGBDR.
    C'est pourquoi, je ne voie pas trop l'intérêt du CTE dans une production, sinon pour dégrader les performances.

    Ma question était surtout sur l'apport que le CTE procure vis-à-vis d'un développement classique.
    Si c'est pour introduire dans une seule écriture (le CTE) une décomposition, qui prendrait plusieurs étapes dans une méthode classique, n'est-ce pas résoudre un problème de fond avec une astuce qui peut coûter cher en performance ?
    Jusqu'à présent, je n'ai jamais vu l'utilité du CTE comme quelque chose de positif, d'où le fait que je ne suis pas très familiarisé avec.
    Et ce que j'entends par "un problème de fond", c'est peut-être de vouloir résoudre dans le SGBDR, qui n'est pas adapté à cela, un problème qui concerne un langage extérieur, comme Pascal (Delphi).
    Et si son intérêt est de faire la récursivité, je n'en voie pas trop l'intérêt dans le milieu bancaire dont je suis issu.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [AC-2013] Requete pour calculer une Moyenne mobile exponentielle (qui depend du recordset precedent.)
    Par lukebalthazar dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 28/06/2014, 00h31
  2. Réponses: 14
    Dernier message: 06/05/2008, 15h16
  3. Calculer une moyenne avec des jours absents
    Par guidav dans le forum Langage SQL
    Réponses: 7
    Dernier message: 25/01/2008, 09h35
  4. Calculer une moyenne avec une matrice
    Par progfou dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 05/06/2006, 16h47
  5. calculer une moyenne avec une requete externe
    Par allowen dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2005, 16h02

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