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 :

Impossible de faire un group by dans une requête ayant une sous-requête


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Octobre 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Octobre 2016
    Messages : 109
    Points : 162
    Points
    162
    Par défaut Impossible de faire un group by dans une requête ayant une sous-requête
    Bonjour



    J’utilise Sql View pour une base de données oracle, et je n’arrive pas à faire un group by dans une requête ayant une sous-requête, J’obtiens le message comme quoi l’identifiant h1 est invalide !



    Je ne peux pas lier ma table « mfgitm » car j’ai plusieurs lignes qui correspond à la jointure, j’ai besoin juste du dernier numéro du champ MFGNUM,



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select a.itmref_0, a.soplin_0, a.soqseq_0, (select max(h.mfgnum_0) from mfgitm h where (h.vcrnumori_0=a.sohnum_0 and a.soplin_0=h.vcrlinori_0 and a.soqseq_0=h.vcrseqori_0 )) as h1
     
    from sorderq a inner join sdeliveryd b on (b.sohnum_0=a.sohnum_0 and b.soplin_0=a.soplin_0)
     
     
    group by a.itmref_0, a.soplin_0, a.soqseq_0, h1


    Merci d’avance

    @+

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 594
    Points : 34 266
    Points
    34 266
    Par défaut
    Salut,

    je tenterais ma chance avec

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select a.itmref_0, a.soplin_0, a.soqseq_0, (select max(h.mfgnum_0) from mfgitm h where (h.vcrnumori_0=a.sohnum_0 and a.soplin_0=h.vcrlinori_0 and a.soqseq_0=h.vcrseqori_0 )) as h1
     
    from sorderq a inner join sdeliveryd b on (b.sohnum_0=a.sohnum_0 and b.soplin_0=a.soplin_0)
     
     group by a.itmref_0, a.soplin_0, a.soqseq_0, (select max(h.mfgnum_0) from mfgitm h where (h.vcrnumori_0=a.sohnum_0 and a.soplin_0=h.vcrlinori_0 and a.soqseq_0=h.vcrseqori_0 ))
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre habitué
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Octobre 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Octobre 2016
    Messages : 109
    Points : 162
    Points
    162
    Par défaut
    Citation Envoyé par Jean-Philippe André Voir le message
    Salut,

    je tenterais ma chance avec

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select a.itmref_0, a.soplin_0, a.soqseq_0, (select max(h.mfgnum_0) from mfgitm h where (h.vcrnumori_0=a.sohnum_0 and a.soplin_0=h.vcrlinori_0 and a.soqseq_0=h.vcrseqori_0 )) as h1
     
    from sorderq a inner join sdeliveryd b on (b.sohnum_0=a.sohnum_0 and b.soplin_0=a.soplin_0)
     
     group by a.itmref_0, a.soplin_0, a.soqseq_0, (select max(h.mfgnum_0) from mfgitm h where (h.vcrnumori_0=a.sohnum_0 and a.soplin_0=h.vcrlinori_0 and a.soqseq_0=h.vcrseqori_0 ))
    Merci
    J ai oublie de preciser que Ca ne fonctionne pas en mettant la sous requête dans le group by j obtiens le message D erreur
    18:07:02 : Ligne 20 : Key violation.
    [Oracle][ODBC][Ora]ORA-22818: expressions de sous-requête non autorisées ici
    ***

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Comme on te l'a déjà expliqué dans une question précédente qui ressemble terriblement à celle-ci, le GROUP BY ne sert à rien ici car il n'y a aucune fonction d'agrégation dans la clause SELECT.

    Il ne sera utile que si tu remplaces la sous-requête par une jointure, comme indiqué dans l'autre question...

    Tatayo.

  5. #5
    Membre habitué
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Octobre 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Octobre 2016
    Messages : 109
    Points : 162
    Points
    162
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Bonjour,
    Comme on te l'a déjà expliqué dans une question précédente qui ressemble terriblement à celle-ci, le GROUP BY ne sert à rien ici car il n'y a aucune fonction d'agrégation dans la clause SELECT.

    Il ne sera utile que si tu remplaces la sous-requête par une jointure, comme indiqué dans l'autre question...

    Tatayo.
    Bonjour

    Si j enlevé le group by, je vais avoir n enregistrement identique en valeur à part le champ mfgnum, C est pour Ca j ai fait une sous requête pour ramener une seule valeur du mfgnum en utilisant une sous requête !

    Je peux vous fournir les donnees qu extrait la requête avec et sans le groupe by pour voir L utilité ?

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    La sous-requête ne peux renvoyer qu'une seule ligne, car il n'y a qu'un MAX() sur une seule colonne. Je ne vois donc pas à quoi peut bien servir un GROUP BY dans la requête principale, car je le répète il n'y a aucune agrégation dans le SELECT correspondant.

    Je veux bien voir un jeu de test, le résultat attendu et celui de la requête, car ici je ne vois pas ce qui cloche.

    Quoi qu'il en soit, cette requête ressemble furieusement à celle que tu nous a présenté dans ta précédente question, donc ici aussi je suis persuadé que tu peux remplacer la sous-requête par une jointure.

    Tatayo.

  7. #7
    Membre habitué
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Octobre 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Octobre 2016
    Messages : 109
    Points : 162
    Points
    162
    Par défaut
    Citation Envoyé par tatayo Voir le message
    La sous-requête ne peux renvoyer qu'une seule ligne, car il n'y a qu'un MAX() sur une seule colonne. Je ne vois donc pas à quoi peut bien servir un GROUP BY dans la requête principale, car je le répète il n'y a aucune agrégation dans le SELECT correspondant.

    Je veux bien voir un jeu de test, le résultat attendu et celui de la requête, car ici je ne vois pas ce qui cloche.

    Quoi qu'il en soit, cette requête ressemble furieusement à celle que tu nous a présenté dans ta précédente question, donc ici aussi je suis persuadé que tu peux remplacer la sous-requête par une jointure.

    Tatayo.
    J’ai 3 tables :
    SORDERQ : table de détail des commandes, clés primaires : SOHNUM+SOPLIN+SOQSEQ (numéro de commande, ligne de commande et numéro de séquence)
    SDELIVERYD : table de détail des livraisons : clés primaires SDHUM+SDHLIN (numéro de livraison et ligne de livraison) et contient les champs SOHNUM et SOPLIN
    MFGITM : tables des ordres de fabrications : clés primaires MFGNUM+MFGLIN et contient les champs numéro de commande, ligne de commande et numéro de séquence

    On peut livrer plusieurs fois une ligne de commande, c’est la raison pour laquelle je regroupe par numéro de ligne de commande.
    On peut aussi avoir plusieurs ordres de fabrications pour une commande, c’est pour ca dans mon lien avec la table MFGITM je prends le max qui est le dernier numéro d’ordre de fabrication.

    Si besoin, je enverrai demain les résultats de la requête avec et sans group by.

  8. #8
    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 fait, c'est cela que tu veux 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
    19
    20
    21
    22
    23
    select  distinct
            a.itmref_0
        ,   a.soplin_0
        ,   a.soqseq_0
        ,   h.h1
    from    sorderq     a
        inner join
            sdeliveryd  b
            on  b.sohnum_0  = a.sohnum_0
            and b.soplin_0  = a.soplin_0
        left join
            (   select  vcrnumori_0
                    ,   vcrlinori_0 
                    ,   vcrseqori_0
                    ,   max(mfgnum_0)   as h1
                from    mfgitm
                group by vcrnumori_0
                    ,   vcrlinori_0 
                    ,   vcrseqori_0   
            )   as h
            on  a.sohnum_0  = h.vcrnumori_0
            and a.soplin_0  = h.vcrlinori_0 
            and a.soqseq_0  = h.vcrseqori_0
    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.

  9. #9
    Membre habitué
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Octobre 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Octobre 2016
    Messages : 109
    Points : 162
    Points
    162
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    En fait, c'est cela que tu veux 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
    19
    20
    21
    22
    23
    select  distinct
            a.itmref_0
        ,   a.soplin_0
        ,   a.soqseq_0
        ,   h.h1
    from    sorderq     a
        inner join
            sdeliveryd  b
            on  b.sohnum_0  = a.sohnum_0
            and b.soplin_0  = a.soplin_0
        left join
            (   select  vcrnumori_0
                    ,   vcrlinori_0 
                    ,   vcrseqori_0
                    ,   max(mfgnum_0)   as h1
                from    mfgitm
                group by vcrnumori_0
                    ,   vcrlinori_0 
                    ,   vcrseqori_0   
            )   as h
            on  a.sohnum_0  = h.vcrnumori_0
            and a.soplin_0  = h.vcrlinori_0 
            and a.soqseq_0  = h.vcrseqori_0
    Merci

    J'obtiens le message d'erreur :

    ***
    14:09:10 : Ligne 1 : Key violation.
    [Oracle][ODBC][Ora]ORA-00905: mot-clé absent
    ***
    J'ai L impression que je ne peux pas utiliser L alias h1 de la table !!!

  10. #10
    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
    C'est simplement la déclaration d'alias sur la table dérivée (ligne 20) qui ne passe pas.
    Enlève le AS qu'Oracle n'accepte pas.
    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.

  11. #11
    Membre habitué
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Octobre 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Octobre 2016
    Messages : 109
    Points : 162
    Points
    162
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    C'est simplement la déclaration d'alias sur la table dérivée (ligne 20) qui ne passe pas.
    Enlève le AS qu'Oracle n'accepte pas.
    Vous etes top !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/07/2016, 16h49
  2. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  3. [WD18] Metre une colonne d'une Table sur une ligne d'une autre Table
    Par Totophe2 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/11/2013, 12h58
  4. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  5. [c#][1.1][VS 2003] Faire un group By dans une datatable
    Par notalp dans le forum Accès aux données
    Réponses: 2
    Dernier message: 03/11/2006, 21h18

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