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 :

Problème group by [11g]


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2013
    Messages
    976
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 976
    Par défaut Problème group by
    Bonjour,
    je suis confronté depuis pas mal de temps et sur plusieurs requête à un léger soucis au niveau du group by.

    Quand je fais une somme , je met mon group by mais j'ai toujours une erreur , voici un exemple de requete que j'ai, avec les différents champs, que je peux avoir

    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
     
    select
    	numero_fichier as num_fichier,
    	annee as annee_fichier,
    (
    	select   sum(ROUND(t21.indemnite,2)) as tot_ind    //champs dans le group by ou non ? 
    	from table3 t21
    	inner join table2 t25 on ......
    	inner join table4 t26 on ......
    	inner join tableAnnee tcamp on ......
    	where  t26.......=d1........
    	and  tcamp.anee= (cast('2017' as integer))
    ) as indemnite_total ,
    nvl(paiement_50e,0) as paiement_50e,
     sum(heure_travaillé) as Temps_travaille,
    drt_acq_pr1 - nvl(nbrs_pr, 0) +
    drt_acq_pr1 - nvl(nbjrs_pr, 0) as drt_reste_pr,
    (NVL(td.nbheureAcci,0)) Nbh_accident_trav,
    (NVL(decode(td.CommAcci,123,'Ignorer',456,'Demande ..........'),0)) AS commentaire_accident,
    from	tabledossier2
    inner join	table4 d1			on .......
    inner join	tableAnnee			on ....
    inner join	............			on ......
    inner join	.....			on s.......
    quand je fais mon group by ça me dit :
    ORA-00979: n'est pas une expression GROUP BY
    00979. 00000 - "not a GROUP BY expression"

    Sqldeveloper me propose une liste de champs pour le group by mais ça marche pas, car j'ai des nvl, nvl(decode etc.... du coup je sais pas si les champs je dois les mettre ou non, ceux qui sont dans le decodes
    Voici la liste que j'ai faite, personnellement j'ai mis tout les champs qu'elles qu'ils soit mais rien à faire, comment ça se fait ?
    Y a til des champs à ne pas mettre dans le group by ?
    Merci d'avance

  2. #2
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    Merci de nous donner l'ordre SQL complet, avec au moins le GROUP BY, ce sera plus simple pour voir où ça coince.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2013
    Messages
    976
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 976
    Par défaut
    bonjour,

    voici les élléments que je prends dans mon group by :

    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
    29
    30
    31
    32
    33
    34
     
     
    select
    	numero_fichier as num_fichier,
    	annee as annee_fichier,
    (
    	select   sum(ROUND(t21.indemnite,2)) as tot_ind    //champs dans le group by ou non ? 
    	from table3 t21
    	inner join table2 t25 on ......
    	inner join table4 t26 on ......
    	inner join tableAnnee tcamp on ......
    	where  t26.......=d1........
    	and  tcamp.anee= (cast('2017' as integer))
    ) as indemnite_total ,
    nvl(nbrejrs_pr, 0) as drt_payes_pr,
    nvl(paiement_50e,0) as paiement_50e,
     sum(heure_travaillé) as Temps_travaille,
    drt_acq_pr1 - nvl(nbrejrs_pr, 0) as drt_reste_pr,
    (NVL(td.nbheureAcci,0)) Nbh_accident_trav,
    (NVL(decode(td.CommAcci,123,'Ignorer',456,'Demande ..........'),0)) AS commentaire_accident,
    from	tabledossier2
    inner join	table4 d1			on .......
    inner join	tableAnnee			on ....
    inner join	............			on ......
    inner join	.....			on s.......
    group by 
    numero_fichier,
    annee,
    t21.indemnite,
    paiement_50e,
    drt_acq_pr1,
    nbrejrs_pr,
    td.nbheureAcci,
    td.CommAcci
    merci beaucoup

  4. #4
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    Essaye d'enlever le sous SELECT "select sum(ROUND(t21.indemnite,2))" : est-ce que ça passe maintenant? Si oui, on a identifié le pb.
    Si non, dans le SELECT il y a 9 champs et que 8 dans le GROUP BY, c'est normal?

    Dernier point, essaye de mettre le nom des alias dans le GROUP BY. Je ne suis pas sur que ce soit l'origine du pb (Oracle traite les alias du SELECT après le GROUP BY je crois) mais ça vaut la peine d'essayer.

  5. #5
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 216
    Par défaut
    Ici , tu as une requete(lignes 1 à 34) et une sous-requete (lignes 7 à 13). Je ne regarde que la sous-requete... la sous-requete DOIT être cohérente.

    Et quand la sous-requete donnera ce qu'on veut, il faudra voir la requête elle-même.

    Exécute ta sous-requête (lignes 7 à13), elle renvoie 1 seule colonne, qui est un cumul. Et elle renvoie une seule ligne, parce qu'il n'y a pas de GROUP BY.
    Si tu rajoutes un GROUP BY, tu auras plusieurs lignes, mais des lignes anonymes... Si par exemple tu calcules un chiffre d'affaire pas usine, tu auras une ligne pour chaque usine, mais tu n'auras pas l'identifiant de l'usine... inexploitable.

    Travaille sur la sous-requête uniquement...

    Par ailleurs, c'est surprenant d'avoir cette sous-requête à cet endroit. Ca doit pouvoir marcher, mais c'est suspect. Il faudrait avoir plus d'infos sur ton besoin pour trancher sur ce point.

    J'ai beaucoup plus souvent vu des constructions comme celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select .... ...
    from   ( SOUS_REQUETE) as x
      inner join autres_tables on ... ...
    Je pense qu'en fait, tu mets la barre trop haut.
    Amuse toi avec ORACLE, exécute des requêtes, analyse les résultats renvoyés par les requêtes. Des requêtes avec des GROUP BY, mais sans cette histoire de sous-requête. Et quand tu auras bien compris comment ça marche sans sous-requête, tu pourras penser à faire des requêtes composites comme celle-ci.

    En fait, imagine un type qui ne sait pas conduire une voiture, et qui essaie de faire une marche-arrière avec un semi-remorque ; il ne peut pas s'en sortir. Il faut d'abord apprendre les choses simples et bien les maitriser, puis apprendre les choses compliquées.

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    C'est une sous requête scalaire, qui est généralement corrélée à la requête principale.
    Donc pas de GROUP BY puis qu'on est dans le SELECT, cette sous-requête ne peut renvoyer qu'une valeur.

    On ne peut pas utiliser d'alias dans le GROUP BY, dans le ORDER BY c'est possible.

    Il faut supprimer t21.indemnite du GROUP BY, d'autant que l'alias t21 n'a pas d'existance à ce niveau de la requête.

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

Discussions similaires

  1. Problème Group by
    Par tollaire dans le forum Langage SQL
    Réponses: 4
    Dernier message: 07/08/2007, 09h51
  2. SharePoint 2007 - Problème groupes et permissions
    Par Najla dans le forum SharePoint
    Réponses: 3
    Dernier message: 20/03/2007, 22h42
  3. Problème group by
    Par nellynew dans le forum Langage SQL
    Réponses: 7
    Dernier message: 19/01/2007, 15h28
  4. [SQL] Problème group by sur view
    Par helene34 dans le forum Oracle
    Réponses: 2
    Dernier message: 04/01/2007, 08h25
  5. Problème Group By
    Par Fishes83 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 03/01/2007, 13h52

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