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 :

[Oracle] enregistrement multiple à cause du group by


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 47
    Points : 20
    Points
    20
    Par défaut [Oracle] enregistrement multiple à cause du group by
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select nvl(sum(salaire.mntrem),0) as totaldept,libdept
    from empl,dept 
    where Trim(dept.coddept) =Trim(empl.coddept) and 
    dept.ansal= '" & Annee & "' and 
    trim(dept.datsal) between to_date('" & Date1 & "','dd/mm/yyyy') and to_date('" & Date2 & "','dd/mm/yyyy')  
    group by coddept,libdept 
    order by totaldept desc
    j'utilise la requête ci-dessus pour éditer un état : il n'y a pas de problème jusque là. Cependant j'ai besoin d'afficher sur ce même état, l'année et la date de paie la requête et modifiée ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select nvl(sum(salaire.mntrem),0) as totaldept,libdept, ansal, datsal
    from empl,dept 
    where Trim(dept.coddept) =Trim(empl.coddept) and 
    dept.ansal= '" & Annee & "' and 
    trim(dept.datsal) between to_date('" & Date1 & "','dd/mm/yyyy') and to_date('" & Date2 & "','dd/mm/yyyy')  
    group by coddept,libdept, ansal, datsal 
    order by totaldept desc
    le problème est que les enregistrements ne sont plus regroupés par département. Ceci est la cause des champs ansal et datsal rajoutés au group by. J'en ai besoin donc je ne peux pas les enlever du "select".
    Comment pourrais-je contourner ce problème?

    Merci

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Et ?
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  3. #3
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Salut,

    Merci de jeter un oeil aux CONSEILS... à lire AVANT de POSTER et de nous donner un minimum d'info sur votre schéma. Mettre une petite phrase d'explication par requête expliquant le but de celle-ci est également bienvenu.

    En l'occurence, il est possible de deviner la signification de certains champs, et à quelle table ils appartiennent, mais moins on a d'hypothèses à faire, plus on donne des réponses pertinentes rapidement


    Si j'essaye de deviner la finalité de la requête, et si vous voulez effectivement afficher par département des informations "ansal" et "datsal" en rapport avec le montant calculé, il est normal que le montant total (par département) soit éclaté dans les différentes lignes correspondant aux valeurs distinctes "ansal" et "datsal" : il vous suffit alors dans votre état de générer une rupture par département en faisant un cumul des lignes correspondantes ... mais ce n'est pas le boulot du SQL de faire la mise en forme de votre état
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  4. #4
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par marceline
    le problème est que les enregistrements ne sont plus regroupés par département. Ceci est la cause des champs ansal et datsal rajoutés au group by. J'en ai besoin donc je ne peux pas les enlever du "select".
    Comment pourrais-je contourner ce problème?
    SI ton moteur le supporte (cela dépend de la version), il y a GROUP BY CUBE ou GROUPE BY ROLLUP.
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 40
    Points : 43
    Points
    43
    Par défaut
    Si les nouveaux champs ont la même valeur pour un département donné, il faut utiliser une fonction type Max() ou Avg() dans le select et conserver le group by d'origine.

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 47
    Points : 20
    Points
    20
    Par défaut
    je vous prie d'accepter mes excuses pour la formulation précédente de mon message.

    voici la nouvelle formulation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT   NVL(SUM(SALAIRE.MNTREM),0) AS TOTALDEPT,
             LIBDEPT
    FROM     EMPL,
             DEPT
    WHERE    TRIM(DEPT.CODDEPT) = TRIM(EMPL.CODDEPT)
             AND DEPT.ANSAL = '2005'
             AND TRIM(DEPT.DATSAL) BETWEEN TO_DATE('01/01/2005','dd/mm/yyyy')
                                           AND TO_DATE('31/04/2005,'dd/mm/yyyy')
    GROUP BY CODDEPT,
             LIBDEPT
    ORDER BY TOTALDEPT DESC
    Pour cette requête, je veux le total des salaires par département du 01/01/2005 au 31/04/2005 et j'obtient le résultat suivant:
    TOTALDEPT | LIBDEPT
    144600 DIRECTION GENERALE
    75000 COMPTABILITE
    54000 LOGISTIQUE
    ... ...

    cependant, j'ai besoin d'exploiter les champs année de salaire (ansal) et date de salaire(datsal), et pour cela il faut qu'ils figurent dans ma clause select.
    il faut obligatoirement que je les rajoute au group by sinon j'ai un message d'erreur.
    Ma base de données est sur oracle9.
    j'exécute alors cette requête:
    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
    SELECT   NVL(SUM(SALAIRE.MNTREM),0) AS TOTALDEPT,
             LIBDEPT,
             ANSAL,
             DATSAL
    FROM     EMPL,
             DEPT
    WHERE    TRIM(DEPT.CODDEPT) = TRIM(EMPL.CODDEPT)
             AND DEPT.ANSAL = '2005'
             AND TRIM(DEPT.DATSAL) BETWEEN TO_DATE('01/01/2005','dd/mm/yyyy')
                                           AND TO_DATE('31/04/2005','dd/mm/yyyy')
    GROUP BY CODDEPT,
             LIBDEPT,
             ANSAL,
             DATSAL
    ORDER BY TOTALDEPT DESC
    le résultat est le suivant:

    TOTALDEPT |LIBDEPT |ANSAL |DATSAL
    12050 DIRECTION GENERALE 2005 01-29-2005
    12050 DIRECTION GENERALE 2005 02-27-2005
    12050 DIRECTION GENERALE 2005 03-30-2005
    12050 DIRECTION GENERALE 2005 04-26-2005
    12050 DIRECTION GENERALE 2005 01-31-2005
    12050 DIRECTION GENERALE 2005 04-29-2005
    12050 DIRECTION GENERALE 2005 03-31-2005
    12050 DIRECTION GENERALE 2005 02-28-2005
    12050 DIRECTION GENERALE 2005 02-26-2005
    12050 DIRECTION GENERALE 2005 01-30-2005
    12050 DIRECTION GENERALE 2005 03-28-2005
    12050 DIRECTION GENERALE 2005 04-24-2005
    6250 COMPTABILITE 2005 01-29-2005
    6250 COMPTABILITE 2005 02-27-2005
    6250 COMPTABILITE 2005 03-31-2005
    6250 COMPTABILITE 2005 04-30-2005
    4500 COMPTABILITE 2005 01-31-2005
    4500 COMPTABILITE 2005 02-27-2005
    4500 COMPTABILITE 2005 03-31-2005
    4500 COMPTABILITE 2005 04-27-2005
    937 LOGISTIQUE 2005 01-28-2005
    937 LOGISTIQUE 2005 02-28-2005
    937 LOGISTIQUE 2005 03-28-2005
    937 LOGISTIQUE 2005 04-30-2005
    ... ... ... ...
    ... ... ... ...

    Il détaille les enregistrements alors que je veux le même résultat que celui de la 1ère requête.

    merci

  7. #7
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Quel ansal et quel datsal choisir dans une groupe ?
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  8. #8
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 47
    Points : 20
    Points
    20
    Par défaut
    il n'y a pas de ansal ni de datsal à choisir

  9. #9
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 47
    Points : 20
    Points
    20
    Par défaut
    en fait si je ne mets pas ansal et datsal dans le group by j'ai l'erreur "not a group by expression"

  10. #10
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par marceline
    Cependant j'ai besoin d'afficher sur ce même état, l'année et la date de paie la requête et modifiée ainsi:
    Citation Envoyé par marceline
    il n'y a pas de ansal ni de datsal à choisir
    Tu les veux ou tu les veux pas ?

    SI tu fais un group by Département, tu vas avoir plusieurs lignes ayant potentiellement des ansal et des datsal différents, donc : quoi prendre ???
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  11. #11
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 47
    Points : 20
    Points
    20
    Par défaut
    Bonjour,

    voici un exemple de ce que je veux:

    Année: 2005 (ansal)
    Période: du 01/01/2005 au 30/04/2005 (datsal)

    TOTALDEPT | LIBDEPT
    144600 DIRECTION GENERALE
    75000 COMPTABILITE
    54000 LOGISTIQUE
    273600 Total

  12. #12
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    C'est exactement le résultat que tu dis obtenir dans le message #6 ???

    A part le total que tu peux obtenir avec un GROUP BY CUBE (ou ROLLUP) si ton moteur l'implémente)
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  13. #13
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Manque juste la période ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT   NVL(SUM(SALAIRE.MNTREM),0) AS TOTALDEPT,
             LIBDEPT,
             MIN (DATSAL) AS DATE_DU,
             MAX (DATSAL) AS DATE_AU
    FROM     EMPL,
             DEPT
    WHERE    TRIM(DEPT.CODDEPT) = TRIM(EMPL.CODDEPT)
             AND DEPT.ANSAL = '2005'
             AND TRIM(DEPT.DATSAL) BETWEEN TO_DATE('01/01/2005','dd/mm/yyyy')
                                           AND TO_DATE('31/04/2005,'dd/mm/yyyy')
    GROUP BY CODDEPT,
             LIBDEPT
    ORDER BY TOTALDEPT DESC
    M'enfin, là, SQL t'a ramené toutes les infos que tu veux, le reste n'est que de la mise en forme pour ton listing
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  14. #14
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 47
    Points : 20
    Points
    20
    Par défaut
    Merci,
    les instructions MIN (DATSAL) AS DATE_DU et MAX (DATSAL) AS DATE_AU dans le select à la place de DATSAL me donnent ce résultat.
    Bien que je ne comprenne pas exactement la différence. Je vais revoir les cours sql.
    Merci à tous et bonne fin de matinée.

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

Discussions similaires

  1. [VB6]Problème dajout dans une Table Access à cause des group
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 01/02/2006, 10h06
  2. Inno Setup : Enregistrer dans la bdr le group
    Par yoghisan dans le forum Outils
    Réponses: 1
    Dernier message: 05/06/2005, 16h04
  3. enregistrements multiples pourquoi?
    Par theclear dans le forum Langage SQL
    Réponses: 6
    Dernier message: 07/12/2004, 12h30
  4. Enregistrements multiples renvoyés à partir d'une excécution
    Par Didier100 dans le forum Bases de données
    Réponses: 2
    Dernier message: 19/07/2004, 15h25
  5. Tables jointes, avec enregistrements multiples
    Par ARRG dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/07/2004, 14h00

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