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 Oracle Discussion :

N'est pas une expression GROUP BY


Sujet :

SQL Oracle

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut N'est pas une expression GROUP BY
    *** Bonjour, ***

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT r.DATETRAIN,r.DEPART_GARE_ID,r.ARRIVE_GARE_ID,r.IDUA,t.NBTRAINPROG as "NB Trains programmés",COUNT(*)as"NB Trains Réalisés",
     
    (select count(*) 
     from STAGAREATEMPS s
     where 
    ((((s.DEPARTRE - s.DEPARTPL)*24*60)between 0 and 15) or (((s.ARRIVERE -s.ARRIVEPL)*24*60)between 0 and 15))and s.IDTRAIN=r.IDTRAIN)/count(*) as "Ponctualité"
     
    from   TRAIN r ,TRAJET t 
    where (r.DEPART_GARE_ID=t.IDGAREDEPART and r.ARRIVE_GARE_ID=t.IDGAREARRIVEE)
    group by DATETRAIN,IDUA,DEPART_GARE_ID,ARRIVE_GARE_ID,t.NBTRAINPROG ;
    Ça provoque :
    ORA-00979: N'est pas une expression GROUP BY
    *** Merci de votre aide. ***

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    En effet, l'expression utilisée dans le calcul de la ponctualité n'est pas reprise dans la clause GROUP BY.
    L'utilisation d'une table dérivée au lieu d'une expression scalaire en même temps que l'écriture normalisée des jointures rendra la requête plus lisible :
    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  r.DATETRAIN
        ,   r.DEPART_GARE_ID
        ,   r.ARRIVE_GARE_ID
        ,   r.IDUA
        ,   t.NBTRAINPROG   AS "NB Trains programmés"
        ,   COUNT(*)        AS "NB Trains Réalisés"
        ,   COALESCE(S.CNT) / COUNT(*) AS "Ponctualité"
    FROM    TRAIN r
        INNER JOIN 
            TRAJET t 
            ON  r.DEPART_GARE_ID = t.IDGAREDEPART 
            AND r.ARRIVE_GARE_ID = t.IDGAREARRIVEE
        LEFT JOIN
            (   SELECT  IDTRAIN
                    ,   COUNT(*)    AS cnt     
                FROM    STAGAREATEMPS
                WHERE   (DEPARTRE - DEPARTPL) * 24 * 60 BETWEEN 0 AND 15
                    OR  (ARRIVERE - ARRIVEPL) * 24 * 60 BETWEEN 0 AND 15
            )   S
            ON  s.IDTRAIN = r.IDTRAIN
    GROUP BY r.DATETRAIN
        ,   r.IDUA
        ,   r.DEPART_GARE_ID
        ,   r.ARRIVE_GARE_ID
        ,   t.NBTRAINPROG
        ,   S.CNT
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (   SELECT  IDTRAIN
                    ,   COUNT(*)    AS cnt     
                FROM    STAGAREATEMPS
                WHERE   (DEPARTRE - DEPARTPL) * 24 * 60 BETWEEN 0 AND 15
                    OR  (ARRIVERE - ARRIVEPL) * 24 * 60 BETWEEN 0 AND 15
            )   S
    Avec un GROUP BY IDTRAIN

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    En effet, il s'était perdu entre les mains et le clavier...

    Je corrige :
    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
    SELECT  r.DATETRAIN
        ,   r.DEPART_GARE_ID
        ,   r.ARRIVE_GARE_ID
        ,   r.IDUA
        ,   t.NBTRAINPROG   AS "NB Trains programmés"
        ,   COUNT(*)        AS "NB Trains Réalisés"
        ,   COALESCE(S.CNT) / COUNT(*) AS "Ponctualité"
    FROM    TRAIN r
        INNER JOIN 
            TRAJET t 
            ON  r.DEPART_GARE_ID = t.IDGAREDEPART 
            AND r.ARRIVE_GARE_ID = t.IDGAREARRIVEE
        LEFT JOIN
            (   SELECT  IDTRAIN
                    ,   COUNT(*)    AS cnt     
                FROM    STAGAREATEMPS
                WHERE   (DEPARTRE - DEPARTPL) * 24 * 60 BETWEEN 0 AND 15
                    OR  (ARRIVERE - ARRIVEPL) * 24 * 60 BETWEEN 0 AND 15
                GROUP BY IDTRAIN
            )   S
            ON  s.IDTRAIN = r.IDTRAIN
    GROUP BY r.DATETRAIN
        ,   r.IDUA
        ,   r.DEPART_GARE_ID
        ,   r.ARRIVE_GARE_ID
        ,   t.NBTRAINPROG
        ,   S.CNT
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

Discussions similaires

  1. ORA-00979: N'est pas une expression GROUP BY
    Par Jinkas dans le forum SQL
    Réponses: 23
    Dernier message: 21/03/2012, 09h46
  2. ORA-00979: N'est pas une expression GROUP BY
    Par chakibtag dans le forum SQL
    Réponses: 2
    Dernier message: 09/07/2008, 10h22
  3. ORA-00979: N'est pas une expression GROUP BY
    Par NiGHtyWolf dans le forum Oracle
    Réponses: 3
    Dernier message: 10/05/2007, 19h11
  4. l'executable n'est pas une win32 valide
    Par joebilou dans le forum Windows
    Réponses: 4
    Dernier message: 28/06/2005, 11h53

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