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

Oracle Discussion :

la clause group by dans un curseur explicite


Sujet :

Oracle

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 64
    Points : 40
    Points
    40
    Par défaut la clause group by dans un curseur explicite
    Salut a tous, je viens de developper un script sql pour ma table ligne_telephonique ayant comme attributs (numligne,idclient,etat)
    le script devrait me retourner les id des clients qui ont exactement 2 lignes seulement, l`une a l`etat normal 'N' et l`autre a l`etat bloquer 'B', alors j`utilisais un curseur explicite pour ce faire:
    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
    declare 
    cursor c IS
    select numligne,etat,idclient 
    from ligne
    where
    etat='N' and etat='R' group by idclient having count(numligne)=2;
    begin
    for rec in c
    loop
    dbms_output.put_line(rec.numligne||rec.etat||rec.idclient);
    end loop;
    exception
    when NO_DATA_FOUND then
    dbms_output.put_line('no data found');
    when others then
    dbms_output.put_line(SQLerrm);
    end;
    /
    Oracle me retourne l`erreur suivante concernant la clause group by!!!!
    ORA-00979: N`est pas une expression GROUP BY
    merci de m`avoir aider

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Pas besoin de bloc PL/SQL ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      SELECT idclient 
        FROM ligne
       WHERE etat IN ('B', 'N')
    GROUP BY idclient
      HAVING count(distinct etat) = 2
         AND count(*) = 2;

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 64
    Points : 40
    Points
    40
    Par défaut
    salut, mais moi je travaille avec un bloc dans lequel se trouve cette commande, j`ai essayer votre code mais la meme erreur persiste
    est ce que c`est a cause de l`emplacement du clause group by

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Si l'erreur subsiste avec le code que je vous ai fourni c'est une erreur de copier / coller

    D'ailleurs pour la colonne etat, dans la description vous parlez de N et B, mais dans le code apparaît N et R. Je vous laisse adapter en fonction de la réalité de votre problème.

    Par contre, le curseur ne renvoit plus les informations etat / numligne, mais c'est parce que vous ne les avez pas demandé :
    le script devrait me retourner les id des clients

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 64
    Points : 40
    Points
    40
    Par défaut
    D'ailleurs pour la colonne etat, dans la description vous parlez de N et B, mais dans le code apparaît N et R. Je vous laisse adapter en fonction de la réalité de votre problème.
    salut,oui j`ai corriger les fautes de frappes mais l`erreur c`etait du au fait que la clause group by exige tout les attributs affecter au select, en tout cas le script marche mais lorsque je demande de les afficher rien ne se passe, d`ailleurs il m`indique que le bloc pl/sql est executer avec succes sans rien afficher bienque j`ai rempli ma base de telle sorte qu`elle devrait repondre au bloc en affichant au moins 2 tuples..voici mon code:
    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
    set serveroutput on;
    declare 
    cursor c IS
    SELECT idclient,numligne,etat
    FROM ligne WHERE etat IN ('B', 'N')
    GROUP BY idclient,numligne,etat
    HAVING count(DISTINCT etat) = 2 AND count(*) = 2;
    begin
    for rec in c
    loop
    dbms_output.put_line(rec.numligne||' '||rec.etat||' '||rec.idclient);
    end loop;
    exception
    when NO_DATA_FOUND then
    dbms_output.put_line('no data found');
    when others then
    dbms_output.put_line(sqlerrm);
    end;
    /
    merci pour l`aide

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Et bien il suffit de refaire une jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WITH SR AS
    (
      SELECT idclient 
        FROM ligne
       WHERE etat IN ('B', 'N')
    GROUP BY idclient
      HAVING count(DISTINCT etat) = 2
         AND count(*) = 2
    )
    SELECT l.idclient, l.numligne, l.etat
      FROM ligne l
           INNER JOIN SR
             ON SR.idclient = l.idclient;

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/07/2019, 09h42
  2. Deux clauses Group by dans une seule requête
    Par JyLo1 dans le forum Langage SQL
    Réponses: 16
    Dernier message: 10/06/2015, 14h37
  3. [2000] remplacer la clause UPDATE dans un curseur
    Par alphabe2000 dans le forum Développement
    Réponses: 4
    Dernier message: 10/10/2013, 17h52
  4. Colonne de type image dans une clause group by
    Par tawrirte dans le forum Langage SQL
    Réponses: 4
    Dernier message: 03/04/2012, 19h16
  5. Réponses: 2
    Dernier message: 26/05/2010, 22h07

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