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 :

Démysthifier le GROUP BY : j'ai echoué !


Sujet :

SQL Oracle

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur etude et developpement
    Inscrit en
    Juillet 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur etude et developpement
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Démysthifier le GROUP BY : j'ai echoué !
    J'ai lu plusieurs sujet du forum sur le group by :
    http://www.developpez.net/forums/d13...by-erreur-sql/
    http://www.developpez.net/forums/d10...champs-resolu/
    http://www.developpez.net/forums/d12...on-agregation/
    Ansi que l'excellent article de Roland Bouman :
    http://cedric-duprez.developpez.com/...group-by/#L9-C

    Malgrès cela je n'arrive toujours pas à mes fins....

    Explication du problème ,
    Sur une base de donnée Orcale , j'ai une table HISTORIQUE :
    HISTORIQUE_ID VERSION_COURANTE MACHINE_ID DATE_LOG NOM_USER APPLICATION_ID

    Exemple de données :
    6;2013-07-02 v2;6545612313561322;03/07/2013 11:43;Toto;application2
    5;2013-07-02 v2;6545612313561322;03/07/2013 11:43;Toto;application1
    4;2013-07-02 v1;6545612313561322;03/07/2013 11:41;Titi;application1
    3;2013-07-02 v1;6545612313561322;03/07/2013 11:41;Titi;application2
    2;2013-07-02 v1;5654654654564654;03/07/2013 10:34;Toto;application2
    1;2013-07-02 v1;5654654654564654;03/07/2013 10:34;Toto;application1

    Je souhaite récupérer pour chaque machine et chaque application installé sur la machine, la dernière version du logiciel installé.

    Ma requette :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT MAX(HISTORIQUE.DATE_LOG) HISTORIQUE.MACHINE_ID, HISTORIQUE.APPLICATION_ID,VERSION_COURANTE
    FROM FSAGATEWAY.HISTORIQUE HISTORIQUE
    GROUP BY HISTORIQUE.MACHINE_ID, HISTORIQUE.APPLICATION_ID
    Évidement je me prend l'erreur :
    ORA-00979 N'est pas une expression group by
    ....

    J'opte pour la solution proposé dans l'article , à savoir utilisé un fonction d'agrégation MAX par exemple sur la colonne VERSION_COURANTE.
    (Je sentais déjà que ce n'etait pas la bonne solution à utiliser...)
    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT MAX(HISTORIQUE.DATE_LOG) HISTORIQUE.MACHINE_ID, HISTORIQUE.APPLICATION_ID,MAX(VERSION_COURANTE)
    FROM FSAGATEWAY.HISTORIQUE HISTORIQUE
    GROUP BY HISTORIQUE.MACHINE_ID, HISTORIQUE.APPLICATION_ID
    ça fonctionnement uniquement parce que mes noms de version utilisent (pour l'instant) une syntaxe croissante (alphabétiquement parlent). Donc les résultat de MAX (DATE_LOG) et de MAX(VERSION_COURANTE) "coïncide".


    Demain ... j'ai ce jeu de donnée plutôt :
    6;alpha;6545612313561322;03/07/2013 11:43;Toto;application2
    5;alpha;6545612313561322;03/07/2013 11:43;Toto;application1
    4;2013-07-02 v1;6545612313561322;03/07/2013 11:41;Titi;application1
    3;2013-07-02 v1;6545612313561322;03/07/2013 11:41;Titi;application2
    2;v1.0;5654654654564654;03/07/2013 10:34;Toto;application2
    1;v1.0;5654654654564654;03/07/2013 10:34;Toto;application1
    ça ne marchera pas ....


    HELP ME

  2. #2
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut,

    La version correspondant à la date la plus récente ?
    Avec keep dense_rank last :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT MAX(HISTORIQUE.DATE_LOG) HISTORIQUE.MACHINE_ID, HISTORIQUE.APPLICATION_ID,MAX(VERSION_COURANTE) KEEP(DENSE_RANK LAST ORDER BY DATE_LOG)
    FROM FSAGATEWAY.HISTORIQUE HISTORIQUE
    GROUP BY HISTORIQUE.MACHINE_ID, HISTORIQUE.APPLICATION_ID

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  3. #3
    Membre à l'essai
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Juillet 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2013
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Bonjour ccornaille,

    Voir aussi mon post: [Résolu] Obtenir la dernière date (la + élevée), il y a 2 jours.

  4. #4
    Candidat au Club
    Homme Profil pro
    Ingénieur etude et developpement
    Inscrit en
    Juillet 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur etude et developpement
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Salut,

    La version correspondant à la date la plus récente ?
    Avec keep dense_rank last :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT MAX(HISTORIQUE.DATE_LOG) HISTORIQUE.MACHINE_ID, HISTORIQUE.APPLICATION_ID,MAX(VERSION_COURANTE) KEEP(DENSE_RANK LAST ORDER BY DATE_LOG)
    FROM FSAGATEWAY.HISTORIQUE HISTORIQUE
    GROUP BY HISTORIQUE.MACHINE_ID, HISTORIQUE.APPLICATION_ID
    C'est parfait !
    Merci beaucoup

    Merci juraph aussi ! effectivement même soucis que moi ;-)
    liens vers ton post : http://www.developpez.net/forums/d13...e-la-p-elevee/
    liens vers des explication du faq/cours :
    http://lalystar.developpez.com/fonct...lytiques/#L3.9

  5. #5
    Candidat au Club
    Homme Profil pro
    Ingénieur etude et developpement
    Inscrit en
    Juillet 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur etude et developpement
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Aussi pour ma culture général, est il possible de résoudre ce problème sans passer par une fonction analytique ?
    Si oui , (je pense que oui...) comment faire ?

  6. #6
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Tu peux aussi chercher avec une sous-requête la date dernière date et filtrer avec le résultat obtenu.
    Cela dit, tu peux encore une fois modifier cette requête pour ajouter un nouveau group by et prendre le max(version_courante) pour avoir exactement le même résultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT HISTORIQUE.DATE_LOG, HISTORIQUE.MACHINE_ID, HISTORIQUE.APPLICATION_ID,VERSION_COURANTE
    FROM FSAGATEWAY.HISTORIQUE HISTORIQUE
    WHERE (HISTORIQUE.MACHINE_ID, HISTORIQUE.APPLICATION_ID, HISTORIQUE.DATE_LOG) = (SELECT MACHINE_ID, APPLICATION_ID, max(DATE_LOG)
                                                                                     FROM FSAGATEWAY.HISTORIQUE HISTORIQUE
                                                                                     GROUP BY HISTORIQUE.MACHINE_ID, HISTORIQUE.APPLICATION_ID)

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  7. #7
    Candidat au Club
    Homme Profil pro
    Ingénieur etude et developpement
    Inscrit en
    Juillet 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur etude et developpement
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    merci !

    je connaissais même pas cette syntaxe
    Where plusieurs champs = (Select ...)

    Sujet Résolu

  8. #8
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Oui, cela marche aussi avec IN, genre (a, b, c) IN (select a, b, c, from ...)

    Sinon, un truc que tu dois sûrement connaître et qui marcherait ici aussi, c'est EXISTS

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

Discussions similaires

  1. [CR8] Groupes nommés par ordre spécifié
    Par PschittN dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 17/05/2004, 23h46
  2. Selection de Groupes ki ne sont pas sous groupes...
    Par superdada dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/07/2003, 14h42
  3. [RaveReport] - Bloquer groupe sur une page
    Par muaddib dans le forum Rave
    Réponses: 3
    Dernier message: 25/02/2003, 16h21
  4. gestion des groupes
    Par muaddib dans le forum QuickReport
    Réponses: 3
    Dernier message: 31/12/2002, 11h01

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