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 :

Regroupement et ordre complexes


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Regroupement et ordre complexes
    Salut,
    j'espère que vous allez pouvoir m'aider.
    c'est un peu le même problème que SebastienM sauf que dans mon cas j'ai 2 tables au lieu d'une table.
    En effet j'ai une table TTRAITEMENT qu'on appelera T(ID, ORDRE, REGROUPEMENT_ID, STATUT...)
    et une autre table TREGROUPEMENTqu'on appelera R (ID, DATEPLANIFICATION, STATUT, REFERENCE...)

    la condition initiale entre les 2 tables est T.REGROUPEMENT_ID = R.ID
    je dois selectionner tous les traitements de statut = 1, les grouper en fonction de la reference du regroupement (GROUP BY R.REFERENCE) et aprés les trier en fonction de ( R.DATEPLANIFICATION et T.ORDRE)

    et à la fin je ne veux récuperer qu'une seule occurence du groupement
    j'ai ecris le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT T.ID, R.REFERENCE
    FROM TTRAITEMENTEXECUTE T, TREGROUPEMENTTRAITEMENT R 
    WHERE T.REGROUPEMENTTRAITEMENT_ID = R.ID 
    AND T.STATUT = 1 
    ORDER BY R.DATEPLANIFICATION, T.ORDRE
    GROUP BY T.ID, R.REFERENCE
    ;
    mais j'ai l'erreur suivante : ORA-00933: la commande SQL ne se termine pas correctement
    et si j'enlève la ligne ORDER BY il me donne le groupement des traitements demandé mais pas triés selon la date de planification
    ID REFERENCE
    ------------------------- -------------------------
    16696003 656
    16696004 656
    16696001 655
    16696002 655

    et en plus moi je ne veux qu'une seule valeur c'est a dire qu'il ne me donne par exemple que les traitements 16696003 et 16696004 qui ont le même regroupement.

    Si vous avez des idées je vous serai reconnaissante

    Merci

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    ORDER BY se situe après GROUP BY.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    La clause ORDER BY se place en fin de requête, donc après la clause GROUP BY.
    Votre clause GROUP BY sans agregat dans le SELECT revient à un SELECT DISTINCT, et je n'ai pas bien saisi ce que vous entendez par "ne récupérer qu'une seule occurrence du groupement".

    EDIT : grillé

  4. #4
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    j'ai en effet essayé order by après group by mais a ce moment on me dit : ORA-00979: n'est pas une expression GROUP BY

    ensuite pour l'occurence comme je l'ai dit tout à l'heure avec mon code j'ai ceci

    ID REFERENCE
    ------------------------- ------------
    16696001 655
    16696002 655
    16696003 656
    16696004 656

    et moi je veux que mon resultat soit juste

    ID REFERENCE
    ------------------------- ------------
    16696001 655
    16696002 655

    ou bien
    ID REFERENCE
    ------------------------- ------------
    16696003 656
    16696004 656

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Une simple condition sur la reference ne suffit-elle pas?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT T.ID, R.REFERENCE
    FROM TTRAITEMENTEXECUTE T, TREGROUPEMENTTRAITEMENT R 
    WHERE T.REGROUPEMENTTRAITEMENT_ID = R.ID 
    AND T.STATUT = 1
    AND R.REFERENCE = '655' 
    ;

  6. #6
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Non, en fait je dois faire un programme qui doit aller chercher dans la base de donnée un regroupement dont les traitements sont au statut 1 donc moi je ne doit rien préciser pour le regroupement, le programme doit juste me retourner un des regroupement que j'ai!!

    merci en tt cas pour ton aide

  7. #7
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    je me suis mal exprimée
    en fait le programme ne doit pas me retourner un des regroupements mais plutot tous les traitements du premier regroupement retourné par ma requête
    j'ai le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    SELECT T.ID, R.REFERENCE
    FROM TTRAITEMENTEXECUTE T, TREGROUPEMENTTRAITEMENT R
    WHERE T.REGROUPEMENTTRAITEMENT_ID = R.ID
    AND T.STATUT= 1
    GROUP BY T.ID, R.REFERENCE, T.ORDRE, R.DATEPLANIFICATION
    ORDER BY T.ORDRE, R.DATEPLANIFICATION
    ce code me donne le resultat suivant :
    ID REFERENCE
    ------------------------- -------------------------
    16696001 655
    16696002 655
    16696003 656
    16696004 656

    etant donné que mon resulat est trié suivant la date de planification je voulais savoir ce que je peux rajouter à mon code pour qu'il me donne les traitements du regroupement suivant l'ordre de la date de planification est dans mon cas il doit donc me retourner ceci:

    ID REFERENCE
    ------------------------- -------------------------
    16696001 655
    16696002 655

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    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 770
    Points : 52 723
    Points
    52 723
    Billets dans le blog
    5
    Par défaut
    Encore une fois GROUP BY ne sert strictement à rien si vous n'avez pas de calcul d'agrégat (SUM, COUNT, AVG, MAX, MIN...)

    A +
    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/ * * * * *

  9. #9
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    oui je m'en suis aperçu, mon code est devenu comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    SELECT T.ID, R.REFERENCE
    FROM TTRAITEMENTEXECUTE T, TREGROUPEMENTTRAITEMENT R 
    WHERE T.REGROUPEMENTTRAITEMENT_ID = R.ID 
    AND T.STATUT = 1 
    ORDER BY R.DATEPLANIFICATION, T.ORDRE
    ce qui me donne le même résultat
    ID REFERENCE
    ------------------------- -------------------------
    16696001 655
    16696002 655
    16696003 656
    16696004 656

    il me faut maintenant juste récupérer que les traitements du premier regoupement sur la liste

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT T.ID, R.REFERENCE
    FROM TTRAITEMENTEXECUTE T
    JOIN TREGROUPEMENTTRAITEMENT R 
         ON T.REGROUPEMENTTRAITEMENT_ID = R.ID 
    	 JOIN 
    	 (
    	  SELECT min(R.REFERENCE) as reference
    	  FROM TTRAITEMENTEXECUTE T
    	  JOIN TREGROUPEMENTTRAITEMENT R 
               ON T.REGROUPEMENTTRAITEMENT_ID = R.ID
    	  WHERE T.STATUT = 1
    	 ) refmin
    	 ON R.reference = refmin.reference 
    WHERE T.STATUT = 1

  11. #11
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Exactement ce que je voulais !!

    Merci beaucoup


  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Je t'en prie. Par contre, pour marquer le sujet comme résolu, tu t'es un peu raté, t'as inclus le bouton dans ton message

  13. #13
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Faut me pardonner c'est la première fois que je demande quelque chose sur le forum, mais ce ne sera surement pas le dernière !!

    Merci

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

Discussions similaires

  1. [Toutes versions] problème pour regrouper des valeurs de cellules tout en respectant l'ordre
    Par songs_of_liberty dans le forum Excel
    Réponses: 5
    Dernier message: 16/04/2009, 18h43
  2. requete SQL avec regroupement et classement par ordre croissant
    Par adelsunwind dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 31/03/2009, 16h01
  3. Ordre d'affichage complexe !
    Par NBleau dans le forum Powerpoint
    Réponses: 5
    Dernier message: 28/09/2008, 04h05
  4. Regroupement Horaire complexe
    Par zitoune92 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 22/09/2008, 08h47
  5. Ordre de selection dans un table un peu complexe
    Par cyberastuces dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/04/2007, 11h48

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