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 :

Combiner deux requêtes CTE en une (firebird 2.5)


Sujet :

SQL Firebird

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 182
    Points : 84
    Points
    84
    Par défaut Combiner deux requêtes CTE en une (firebird 2.5)
    SALUT
    Le script de création de base de données est ici

    1-commet Combinez deux requêtes suivantes pour calculer la moyenne semestrielle (Semestre1) et (Semestre2) en une requête Plus calcule la moyenne finle telque: Moyenne_finale=(moyenne semestrielle (Semestre1) +moyenne semestrielle (Semestre2) )/2



    Requête pour calculer la moyenne semestrielle (Semestre1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH MOY AS
    (SELECT N_INSCRIPTION,CODE_MODULE,CODE_SEMESTRE,(CONTROLE1+CONTROLE2+(EXAMEN*2))/4   AS MOYENNE 
     FROM RESULTATS R)
     
    SELECT MOY.N_INSCRIPTION,E.NOM,E.PRENOM,COUNT(1) NB_MODULES,SUM(moyenne)/COUNT(1) AS M_Semestre1
    FROM MOY JOIN ETUDIANTES E ON E.N_INSCRIPTION=MOY.N_INSCRIPTION 
    WHERE MOY.CODE_SEMESTRE='S1' 
    GROUP BY MOY.N_INSCRIPTION,E.NOM,E.PRENOM
    Requête pour calculer la moyenne semestrielle (Semestre2)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH MOY AS
    (SELECT N_INSCRIPTION,CODE_MODULE,CODE_SEMESTRE,(CONTROLE1+CONTROLE2+(EXAMEN*2))/4   AS MOYENNE 
     FROM RESULTATS R)
     
    SELECT MOY.N_INSCRIPTION,E.NOM,E.PRENOM,COUNT(1) NB_MODULES,SUM(moyenne)/COUNT(1) AS M_Semestre2 
    FROM MOY JOIN ETUDIANTES E ON E.N_INSCRIPTION=MOY.N_INSCRIPTION 
    WHERE MOY.CODE_SEMESTRE='S2' 
    GROUP BY MOY.N_INSCRIPTION,E.NOM,E.PRENOM
    Delphi installés : RAD Studio 10.4.1 ..........Programme VCL
    SGBD : Firebird 2.5
    générateurs Etats : FastReport, QuickReport
    OS : Window 10 64bit

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    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 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Un peu de réflexion ! J'ai l'impression que, à peine l'exercice posé, vous le re-transposez sur le forum sans aucune tentatives.

    Tout d'abord pour obtenir les requêtes combinées une seule requête suffit. Ça vous auriez pu le trouver

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WITH MOY AS
    (SELECT N_INSCRIPTION,CODE_MODULE,CODE_SEMESTRE,(CONTROLE1+CONTROLE2+(EXAMEN*2))/4   AS MOYENNE 
     FROM RESULTATS R)
     
    SELECT MOY.N_INSCRIPTION,E.NOM,E.PRENOM,CODE_SEMESTRE,COUNT(1) NB_MODULES,SUM(moyenne)/COUNT(1) AS MOYENNE_SEMESTRE
    FROM MOY JOIN ETUDIANTES E ON E.N_INSCRIPTION=MOY.N_INSCRIPTION 
    WHERE MOY.CODE_SEMESTRE IN ('S1','S2') 
    GROUP BY MOY.N_INSCRIPTION,E.NOM,E.PRENOM,CODE_SEMESTRE
    Ensuite, rien n'empêche de déclarer la précédente requête comme étant elle aussi une CTE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH 
    MOY AS (SELECT N_INSCRIPTION,CODE_MODULE,CODE_SEMESTRE,(CONTROLE1+CONTROLE2+(EXAMEN*2))/4   AS MOYENNE 
                 FROM RESULTATS R),
    MS AS ( 
      SELECT N_INSCRIPTION,CODE_SEMESTRE,COUNT(1) NB_MODULES,SUM(moyenne)/COUNT(1) AS MOYENNE_SEMESTRE
      FROM MOY  
      WHERE CODE_SEMESTRE IN ('S1','S2') 
      GROUP BY N_INSCRIPTION,CODE_SEMESTRE),
    
    MA AS (SELECT N_INSCRIPTION,COUNT(1) NB_SEMESTRES,SUM(MOYENNE_SEMESTRE) TOTAL_ANNEE FROM MS GROUP BY N_INSCRIPTION)
    à partir de là une requête avec UNION est possible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT MS.N_INSCRIPTION,1,E.NOM,E.PRENOM,MS.CODE_SEMESTRE,MS.MOYENNE_SEMESTRE FROM MS JOIN ETUDIANTES E ON E.N_INSCRIPTION=MOY.N_INSCRIPTION 
    UNION
    SELECT MA.N_INSCRIPTION,2,E.NOM,E.PRENOM,'ANNEE',MA.TOTAL_ANNEE/NB_SEMESTRES  FROM MS JOIN ETUDIANTES E ON E.N_INSCRIPTION=MOY.N_INSCRIPTION
    L'astuce de l'union c'est que l'ordre est fournie par la liste des colonnes d'où l'adjonction d'un chiffre (1 pour les semestres, 2 pour l'année) rien n'empêche de changer l'ordre par exemple pour obtenir en ordre Alpha sur nom, prénom
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SELECT E.NOM,E.PRENOM,N_INSCRIPTION, ...
    Il reste que je ne suis toujours pas d'accord avec la structure des tables, s'il s'agit d'un exercice quel prof ose pareille chose ! (critique de la part de quelqu'un qui a sévit en tant que tel)
    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 régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 182
    Points : 84
    Points
    84
    Par défaut
    merci SergioMaster Tu es le meilleur

    J'ai rencontré une erreur lors de l'exécution de la requête suivante (J'ai corrigé le mot manquant qui est : AS)

    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
    WITH 
    MOY AS (SELECT N_INSCRIPTION,CODE_MODULE,CODE_SEMESTRE,(CONTROLE1+CONTROLE2+(EXAMEN*2))/4   AS MOYENNE 
                 FROM RESULTATS R),
    MS AS ( 
      SELECT N_INSCRIPTION,CODE_SEMESTRE,COUNT(1) NB_MODULES,SUM(moyenne)/COUNT(1) AS MOYENNE_SEMESTRE
      FROM MOY  
      WHERE CODE_SEMESTRE IN ('S1','S2') 
      GROUP BY N_INSCRIPTION,CODE_SEMESTRE),
    
    MA AS (SELECT N_INSCRIPTION,COUNT(1) NB_SEMESTRES,SUM(MOYENNE_SEMESTRE) AS TOTAL_ANNEE FROM MS GROUP BY N_INSCRIPTION)
    
    SELECT MS.N_INSCRIPTION,1,E.NOM,E.PRENOM,MS.CODE_SEMESTRE,MS.MOYENNE_SEMESTRE FROM MS JOIN ETUDIANTES E ON E.N_INSCRIPTION=MOY.N_INSCRIPTION 
    UNION
    SELECT MA.N_INSCRIPTION,2,E.NOM,E.PRENOM,'ANNEE',MA.TOTAL_ANNEE/NB_SEMESTRES  FROM MS JOIN ETUDIANTES E ON E.N_INSCRIPTION=MOY.N_INSCRIPTION

    Erreur qui apparaît: ou est le problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Engine Error (code = 335544569):
    Dynamic SQL Error.
    SQL error code = -206.
    Column unknown.
    MOY.N_INSCRIPTION.
    At line 11, column 128.
     
    SQL Error (code = -206):
    Column does not belong to referenced table.
    Delphi installés : RAD Studio 10.4.1 ..........Programme VCL
    SGBD : Firebird 2.5
    générateurs Etats : FastReport, QuickReport
    OS : Window 10 64bit

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    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 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par delphi2019 Voir le message
    Erreur qui apparaît: ou est le problème
    Franchement ? Vous n'avez pas vu qu'il fallait modifier la jointure !

    Une erreur de mon copier/coller qui arait du vous sauter aux yeux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT MS.N_INSCRIPTION,1,E.NOM,E.PRENOM,MS.CODE_SEMESTRE,MS.MOYENNE_SEMESTRE FROM MS JOIN ETUDIANTES E ON E.N_INSCRIPTION=MS.N_INSCRIPTION 
    UNION
    SELECT MA.N_INSCRIPTION,2,E.NOM,E.PRENOM,'ANNEE',MA.TOTAL_ANNEE/NB_SEMESTRES  FROM MA JOIN ETUDIANTES E ON E.N_INSCRIPTION=MA.N_INSCRIPTION
    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

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 182
    Points : 84
    Points
    84
    Par défaut
    Meeeerci

    J'ai corrigé le mot : MA

    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
    WITH 
    MOY AS (SELECT N_INSCRIPTION,CODE_MODULE,CODE_SEMESTRE,(CONTROLE1+CONTROLE2+(EXAMEN*2))/4   AS MOYENNE 
                 FROM RESULTATS R),
    MS AS ( 
      SELECT N_INSCRIPTION,CODE_SEMESTRE,COUNT(1) NB_MODULES,SUM(moyenne)/COUNT(1) AS MOYENNE_SEMESTRE
      FROM MOY  
      WHERE CODE_SEMESTRE IN ('S1','S2') 
      GROUP BY N_INSCRIPTION,CODE_SEMESTRE),
    
    MA AS (SELECT N_INSCRIPTION,COUNT(1) NB_SEMESTRES,SUM(MOYENNE_SEMESTRE) AS TOTAL_ANNEE FROM MS GROUP BY N_INSCRIPTION)
    
    
    SELECT MS.N_INSCRIPTION,1,E.NOM,E.PRENOM,MS.CODE_SEMESTRE,MS.MOYENNE_SEMESTRE FROM MS JOIN ETUDIANTES E ON E.N_INSCRIPTION=MS.N_INSCRIPTION 
    UNION
    SELECT MA.N_INSCRIPTION,2,E.NOM,E.PRENOM,'ANNEE',MA.TOTAL_ANNEE/NB_SEMESTRES  FROM MA JOIN ETUDIANTES E ON E.N_INSCRIPTION=MA.N_INSCRIPTION
    Delphi installés : RAD Studio 10.4.1 ..........Programme VCL
    SGBD : Firebird 2.5
    générateurs Etats : FastReport, QuickReport
    OS : Window 10 64bit

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 17/07/2012, 14h41
  2. [VxiR2] combiner deux requêtes
    Par coolmek dans le forum Deski
    Réponses: 1
    Dernier message: 18/04/2012, 15h38
  3. [AC-2007] Relation entre deux requêtes pour rechercher une valeur de champs commune
    Par Debutant10 dans le forum Requêtes et SQL.
    Réponses: 14
    Dernier message: 01/11/2011, 14h25
  4. Deux requêtes SQL en une
    Par lionrouge dans le forum SQL
    Réponses: 6
    Dernier message: 18/11/2010, 08h51
  5. Deux requêtes SELECT en une seule
    Par isitien dans le forum Langage SQL
    Réponses: 8
    Dernier message: 07/05/2008, 20h08

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