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 :

Not a GROUP BY expression


Sujet :

SQL Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut Not a GROUP BY expression
    Bonjour,

    J'ai deux serveur oracle, sur l'un ma requête fonctionne correctement, sur l'autre oracle me renvoi une erreur ORA-00979: not a GROUP BY expression.

    Personnellement je ne vois aucun problème au niveau d'un de mes group by. La seule différence entre les deux serveur est la version. Celui sur lequel la requête s'exécute est en version Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod. Celui sur lequel oracle me renvoie l'erreur est en version Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod.

    L'autre différence entre les deux serveurs est le contenu de la base mais je ne vois pas comment je pourrais avoir une erreur de group by du au contenu de la base...

    Ci-dessous la requête concernée :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    SELECT ORGANIZATIONID,
           DAYPART,
           SUM(PRDNETSALES) PRDNETSALES,
           100/(SUBDLYGST.NETSLS/DECODE(SUM(PRDNETSALES),0,1,SUM(PRDNETSALES))) PRDNETRATE,
           SUM(PRDGROSSSALES) PRDGROSSSALES,
           100/(SUBDLYGST.GROSSSLS/DECODE(SUM(PRDGROSSSALES),0,1,SUM(PRDGROSSSALES))) PRDGROSSRATE,
           SUM(PRDGUESTS) PRDGUESTS,
           100/(SUBDLYGST.NUMGUESTS/DECODE(SUM(PRDGUESTS),0,1,SUM(PRDGUESTS))) PRDGUESTSRATE,
           SUM(PRDNETSALES)/SUM(PRDGUESTS) PRDNETTM,
           SUM(PRDGROSSSALES)/SUM(PRDGUESTS) PRDGROSSTM,
           TRUNC(AVG(PRDDININGTIME),0) PRDAVGDININGTIME
    FROM (SELECT    ORGANIZATIONID,
                    CASE 
                        WHEN    FIXEDPERIOD BETWEEN 25 AND 62 THEN 
                                CASE
                                    WHEN (TO_CHAR (BUSINESSDATE,'DY') IN ('MON','TUE','WED','THU','FRY')) OR
                                         (TO_CHAR (BUSINESSDATE,'DY') IN ('LUN.','MAR.','MER.','JEU.','VEN.')) THEN 'Midi Semaine' ELSE 'Midi Week End'
                                END        
                        WHEN    FIXEDPERIOD BETWEEN 63 AND 72 THEN 
                                CASE
                                    WHEN (TO_CHAR (BUSINESSDATE,'DY') IN ('MON','TUE','WED','THU','FRY')) OR
                                         (TO_CHAR (BUSINESSDATE,'DY') IN ('LUN.','MAR.','MER.','JEU.','VEN.')) THEN 'Après Midi Semaine' ELSE 'Après Midi Week End'
                                END
                        WHEN    (FIXEDPERIOD BETWEEN 73 AND 96) OR 
                                (FIXEDPERIOD BETWEEN 1 AND 24) THEN 
                                CASE
                                    WHEN (TO_CHAR (BUSINESSDATE,'DY') IN ('MON','TUE','WED','THU','FRY')) OR
                                         (TO_CHAR (BUSINESSDATE,'DY') IN ('LUN.','MAR.','MER.','JEU.','VEN.')) THEN 'Soir Semaine' ELSE 'Soir Week End'
                                END
                    END DAYPART, 
                    NETSALESTOTAL PRDNETSALES,
                    NETSALESTOTAL - DISCOUNTTOTAL PRDGROSSSALES,
                    NUMGUESTS PRDGUESTS,
                    DININGTIME/60 PRDDININGTIME  
        FROM OPERATIONS_FIXED_PERIOD_TOTAL OFPT
        WHERE ORGANIZATIONID = 10001
            AND BUSINESSDATE = '12-nov-09'
            AND LOCATIONID = 2043 ) SUBMAIN,
            (SELECT SUM(NUMGUESTS) NUMGUESTS,
                     SUM(DISCOUNTTOTAL) DSCTTL,
                     NVL(SUM(NETSALESTOTAL),0) NETSLS,
                     NVL(SUM(NETSALESTOTAL) - SUM(DISCOUNTTOTAL),0) GROSSSLS
             FROM OPERATIONS_FIXED_PERIOD_TOTAL
             WHERE ORGANIZATIONID = 10001
                AND LOCATIONID = 2043
                AND BUSINESSDATE = '12-nov-09') SUBDLYGST 
    GROUP BY    ORGANIZATIONID,
                DAYPART,
                SUBDLYGST.NETSLS,
                SUBDLYGST.GROSSSLS,
                SUBDLYGST.NUMGUESTS
    Je précise que j'ai testé les deux sous requêtes subdlygst et submain individuellement et que je n'ai pas d'erreur de group by... théoriquement le souci viendrait donc de la requête principale...

    Merci d'avance pour votre aide.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Par défaut
    essais ceci

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    Select ORGANIZATIONID,  DAYPART, PRDNETSALES, PRDGROSSSALES,
           PRDGUESTS,
     100/(SUBDLYGST.NETSLS/DECODE(PRDNETSALES,0,1,PRDNETSALES))  PRDNETRATE,
     100/(SUBDLYGST.GROSSSLS/DECODE(PRDGROSSSALES,0,1,PRDGROSSSALES))    PRDGROSSRATE,
           100/(SUBDLYGST.NUMGUESTS/DECODE(PRDGUESTS,0,1,PRDGUESTS)) PRDGUESTSRATE,
           PRDNETSALES/PRDGUESTS PRDNETTM,
           PRDGROSSSALES/PRDGUESTS PRDGROSSTM,
           TRUNC(PRDDININGTIME,0) PRDAVGDININGTIME
    From
    (SELECT ORGANIZATIONID,
           DAYPART,
           SUM(PRDNETSALES) PRDNETSALES,
           SUM(PRDGROSSSALES) PRDGROSSSALES,
           SUM(PRDGUESTS) PRDGUESTS,
           AVG(PRDDININGTIME) PRDDININGTIME
           FROM (SELECT    ORGANIZATIONID,
                    CASE 
                        WHEN    FIXEDPERIOD BETWEEN 25 AND 62 THEN 
                                CASE
                                    WHEN (TO_CHAR (BUSINESSDATE,'DY') IN ('MON','TUE','WED','THU','FRY')) OR
                                         (TO_CHAR (BUSINESSDATE,'DY') IN ('LUN.','MAR.','MER.','JEU.','VEN.')) THEN 'Midi Semaine' ELSE 'Midi Week End'
                                END        
                        WHEN    FIXEDPERIOD BETWEEN 63 AND 72 THEN 
                                CASE
                                    WHEN (TO_CHAR (BUSINESSDATE,'DY') IN ('MON','TUE','WED','THU','FRY')) OR
                                         (TO_CHAR (BUSINESSDATE,'DY') IN ('LUN.','MAR.','MER.','JEU.','VEN.')) THEN 'Après Midi Semaine' ELSE 'Après Midi Week End'
                                END
                        WHEN    (FIXEDPERIOD BETWEEN 73 AND 96) OR 
                                (FIXEDPERIOD BETWEEN 1 AND 24) THEN 
                                CASE
                                    WHEN (TO_CHAR (BUSINESSDATE,'DY') IN ('MON','TUE','WED','THU','FRY')) OR
                                         (TO_CHAR (BUSINESSDATE,'DY') IN ('LUN.','MAR.','MER.','JEU.','VEN.')) THEN 'Soir Semaine' ELSE 'Soir Week End'
                                END
                    END DAYPART, 
                    NETSALESTOTAL PRDNETSALES,
                    NETSALESTOTAL - DISCOUNTTOTAL PRDGROSSSALES,
                    NUMGUESTS PRDGUESTS,
                    DININGTIME/60 PRDDININGTIME  
        FROM OPERATIONS_FIXED_PERIOD_TOTAL OFPT
        WHERE ORGANIZATIONID = 10001
            AND BUSINESSDATE = '12-nov-09'
            AND LOCATIONID = 2043 ) SUBMAIN,
            (SELECT SUM(NUMGUESTS) NUMGUESTS,
                     SUM(DISCOUNTTOTAL) DSCTTL,
                     NVL(SUM(NETSALESTOTAL),0) NETSLS,
                     NVL(SUM(NETSALESTOTAL) - SUM(DISCOUNTTOTAL),0) GROSSSLS
             FROM OPERATIONS_FIXED_PERIOD_TOTAL
             WHERE ORGANIZATIONID = 10001
                AND LOCATIONID = 2043
                AND BUSINESSDATE = '12-nov-09') SUBDLYGST 
    GROUP BY    ORGANIZATIONID,
                DAYPART
    ) TEST

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut
    Très bizarre...

    Lorsque j'exécute ma sous requête submain individuellement elle fonctionne parfaitement.

    Lorsque je commente la colonne daypart dans le group by et dans le select de la requete principale ma requête fonctionne correctement

    C'est quoi ce délire ???
    J'ai l'impression que le problème vient de près ou de loin du case when mais alors pourquoi la sous-requête s'exécuterait correctement ??? j'y comprend rien

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut
    merci teach.

    Je n'ai pas encore regardé ta modif en détails mais j'ai fait un copier/coller de ta requete tel quel et oracle me renvoie ORA-00904: "SUBDLYGST"."NUMGUESTS": invalid identifier

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut
    ha bah oui c'est normal car maintenant ma sous requete SUBDLYGST descend d'un niveau a cause de la sous requete TEST du coup elle n'est plus accessible par la requete principale.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut
    je crois que j'avais un peu saisis le sens de ta modif du coup j'ai rajouté une requête qui englobait toutes les autres et qui contenait tous mes sum(), la requête directement parente de celle contenant le case when ne contenant ainsi plus de sum mais c'est pareil...

  7. #7
    Membre éclairé
    Inscrit en
    Juillet 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 76
    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
    15
    16
    17
    WITH t AS
    (
    SELECT 1 AS id,'id1' AS libelle, NULL AS pere FROM dual union ALL
    SELECT 2 ,'id2' , 1 FROM dual union ALL
    SELECT 3 ,'id2' , 1 FROM dual union ALL
    SELECT 4 ,'id4' , NULL FROM dual
    )
    select libelle,id from t
    group by libelle
     
     
    WITH t AS
    (
    SELECT 4 as id,'id4' as libelle, NULL FROM dual
    )
    select libelle,id from t
    group by libelle
    Le contenu des tables est très important.
    Ma premiere requete plante. pas la seconde.
    Une des deux bases n'est pas vide?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut
    Citation Envoyé par boutade80 Voir le message
    Le contenu des tables est très important.
    Ma premiere requete plante. pas la seconde.
    Une des deux bases n'est pas vide?
    Non les bases ne sont pas vides, j'ai vérifié le contenu des deux tables utilisées dans ma requête en utilisant les mêmes clauses WHERE. Je n'ai aucun champs vide ni aucun champ NULL...

    Par contre ton exemple m'a beaucoup interessé car très franchement je ne comprend pas pourquoi la première requête plante... à priori c'est du au union all car chaque requête fonctionne individuellement... un peu comme mon cas à part que je n'ai pas un union all mais deux sous requêtes...

    Je me suis également dit que ca pouvait peut être provenir de la version de Toad, c'est peut être complètement idiot comme réflexion mais bon la je suis à la limite de la dépression nerveuse avec cette requête donc je tente un peu tout même ce qui me parait inutile Ca ne vient pas de la version de toad puisque c'est exactement la même...

    Au passage merci pour le "WITH...AS" je ne connaissais pas du tout... penses-tu que je puisse utiliser cette syntaxe lorsque j'ai des sous requêtes ? car ca doit permettre d'avoir un code plus clair dans certains cas.

    Bon en tout cas ca ne résout pas mon problème

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Par défaut
    Je te renvoie ma solution avec l'ajout des champs manquant dans le group by et la requête principale

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    SELECT ORGANIZATIONID,  DAYPART, PRDNETSALES, PRDGROSSSALES,
           PRDGUESTS,
     100/(NETSLS/DECODE(PRDNETSALES,0,1,PRDNETSALES))  PRDNETRATE,
     100/(GROSSSLS/DECODE(PRDGROSSSALES,0,1,PRDGROSSSALES))    PRDGROSSRATE,
           100/(NUMGUESTS/DECODE(PRDGUESTS,0,1,PRDGUESTS)) PRDGUESTSRATE,
           PRDNETSALES/PRDGUESTS PRDNETTM,
           PRDGROSSSALES/PRDGUESTS PRDGROSSTM,
           TRUNC(PRDDININGTIME,0) PRDAVGDININGTIME
    FROM
    (SELECT ORGANIZATIONID,
           DAYPART,
           SUBDLYGST.NETSLS,
           SUBDLYGST.GROSSSLS,
           SUBDLYGST.NUMGUESTS,
           SUM(PRDNETSALES) PRDNETSALES,
           SUM(PRDGROSSSALES) PRDGROSSSALES,
           SUM(PRDGUESTS) PRDGUESTS,
           AVG(PRDDININGTIME) PRDDININGTIME
           FROM (SELECT    ORGANIZATIONID,
                    CASE 
                        WHEN    FIXEDPERIOD BETWEEN 25 AND 62 THEN 
                                CASE
                                    WHEN (TO_CHAR (BUSINESSDATE,'DY') IN ('MON','TUE','WED','THU','FRY')) OR
                                         (TO_CHAR (BUSINESSDATE,'DY') IN ('LUN.','MAR.','MER.','JEU.','VEN.')) THEN 'Midi Semaine' ELSE 'Midi Week End'
                                END        
                        WHEN    FIXEDPERIOD BETWEEN 63 AND 72 THEN 
                                CASE
                                    WHEN (TO_CHAR (BUSINESSDATE,'DY') IN ('MON','TUE','WED','THU','FRY')) OR
                                         (TO_CHAR (BUSINESSDATE,'DY') IN ('LUN.','MAR.','MER.','JEU.','VEN.')) THEN 'Après Midi Semaine' ELSE 'Après Midi Week End'
                                END
                        WHEN    (FIXEDPERIOD BETWEEN 73 AND 96) OR 
                                (FIXEDPERIOD BETWEEN 1 AND 24) THEN 
                                CASE
                                    WHEN (TO_CHAR (BUSINESSDATE,'DY') IN ('MON','TUE','WED','THU','FRY')) OR
                                         (TO_CHAR (BUSINESSDATE,'DY') IN ('LUN.','MAR.','MER.','JEU.','VEN.')) THEN 'Soir Semaine' ELSE 'Soir Week End'
                                END
                    END DAYPART, 
                    NETSALESTOTAL PRDNETSALES,
                    NETSALESTOTAL - DISCOUNTTOTAL PRDGROSSSALES,
                    NUMGUESTS PRDGUESTS,
                    DININGTIME/60 PRDDININGTIME  
        FROM OPERATIONS_FIXED_PERIOD_TOTAL OFPT
        WHERE ORGANIZATIONID = 10001
            AND BUSINESSDATE = '12-nov-09'
            AND LOCATIONID = 2043 ) SUBMAIN,
            (SELECT SUM(NUMGUESTS) NUMGUESTS,
                     SUM(DISCOUNTTOTAL) DSCTTL,
                     NVL(SUM(NETSALESTOTAL),0) NETSLS,
                     NVL(SUM(NETSALESTOTAL) - SUM(DISCOUNTTOTAL),0) GROSSSLS
             FROM OPERATIONS_FIXED_PERIOD_TOTAL
             WHERE ORGANIZATIONID = 10001
                AND LOCATIONID = 2043
                AND BUSINESSDATE = '12-nov-09') SUBDLYGST 
    GROUP BY   ORGANIZATIONID,
                     DAYPART,
                    SUBDLYGST.NETSLS,
    	   SUBDLYGST.GROSSSLS,
    	   SUBDLYGST.NUMGUESTS
     
    ) TEST

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut
    Citation Envoyé par teach Voir le message
    Je te renvoie ma solution avec l'ajout des champs manquant dans le group by et la requête principale
    Merci teach, malheureusement j'obtient le même résultat : ORA-00979: not a GROUP BY expression

  11. #11
    Membre éclairé
    Inscrit en
    Juillet 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 76
    Par défaut
    Citation Envoyé par koktel_dfr Voir le message
    Non les bases ne sont pas vides, j'ai vérifié le contenu des deux tables utilisées dans ma requête en utilisant les mêmes clauses WHERE. Je n'ai aucun champs vide ni aucun champ NULL...

    Par contre ton exemple m'a beaucoup interessé car très franchement je ne comprend pas pourquoi la première requête plante... à priori c'est du au union all car chaque requête fonctionne individuellement... un peu comme mon cas à part que je n'ai pas un union all mais deux sous requêtes...

    Je me suis également dit que ca pouvait peut être provenir de la version de Toad, c'est peut être complètement idiot comme réflexion mais bon la je suis à la limite de la dépression nerveuse avec cette requête donc je tente un peu tout même ce qui me parait inutile Ca ne vient pas de la version de toad puisque c'est exactement la même...

    Au passage merci pour le "WITH...AS" je ne connaissais pas du tout... penses-tu que je puisse utiliser cette syntaxe lorsque j'ai des sous requêtes ? car ca doit permettre d'avoir un code plus clair dans certains cas.

    Bon en tout cas ca ne résout pas mon problème
    La premiere requete plante parce qu'Oracle ne sait quel id prendre pour l'associer au libelle.

    id libelle
    1 ,'id1
    2 ,'id2'
    3 ,'id2'

    pdt execution

    id libelle
    1 'id1'
    ? 'id2'

    lequel choisir? 2 ou 3?

    Je recommande grandement l'utilisation du with. En plus d'avoir un code mieux formaté, ca te permet aussi de factoriser des actions et de gagner du tps d'execution ds le cas ou le contenu de ton with est appellé plusieurs fois.

    Regarde les traces de requetes suivantes:
    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
    WITH t AS
    (
    SELECT '01' id, 'untel' lib, 64 nb FROM dual union ALL
    SELECT '01' id, 'untel' lib, 128 FROM dual
    )
    select id,lib,nb from t
    group by id,lib,nb
    union all
    select id,lib,nb from t
    group by id,lib,nb
     
     
     
    select id,lib,nb from 
    (
    SELECT '01' id, 'untel' lib, 64 nb FROM dual union ALL
    SELECT '01' id, 'untel' lib, 128 FROM dual
    )
    group by id,lib,nb
    union all
    select id,lib,nb from 
    (
    SELECT '01' id, 'untel' lib, 64 nb FROM dual union ALL
    SELECT '01' id, 'untel' lib, 128 FROM dual
    )
    group by id,lib,nb

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut
    Si ca peut aider voici le contenu de la table avec toutes les colonnes pour chacune des sous requêtes (j'ai viré les sum() et les nvl() pour avoir les données "brutes"). J'ai choisis une autre journée car j'avais trop de données sur le 12-nov-09 mais le problème reste le même sur cette journée :

    SUBDLYGST



    SUBMAIN

  13. #13
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Par défaut
    Si tu penses que ton erreur vient du case, je te conseille de mettre une constante à la place du case tel que
    et vois si l'erreur persiste.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut
    J'ai essayé autre chose... j'ai remarqué que je pouvais remplacer le code de la sous requete SUBDLYGST en allant taper dans une autre table mais en récupérant les même données. L'avantage de cette autre table c'est que je n'ai plus besoins des sum() dans ma sous requete car les même totaux sont renvoyé sur une seule ligne... mais malheureusement, même résultat !!! not a group by....

    Pour info voila le code que j'ai testé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    (SELECT NVL(NUMGUESTS,0) NUMGUESTS,
                     NVL(ITEMDISCOUNTTOTAL,0) DSCTTL,
                     NVL(NETSALESTOTAL,0) NETSLS,
                     NVL(NETSALESTOTAL,0) - NVL(ITEMDISCOUNTTOTAL,0) GROSSSLS
             FROM OPERATIONS_DAILY_TOTAL
             WHERE ORGANIZATIONID = 10001
                AND LOCATIONID = 2043
                AND BUSINESSDATE = '10-mar-10') SUBDLYGST

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut
    Citation Envoyé par teach Voir le message
    Si tu penses que ton erreur vient du case, je te conseille de mettre une constante à la place du case tel que
    et vois si l'erreur persiste.
    Très bonne idée ! je suis maintenant certains que le problème vient du CASE car lorsque comme tu me l'as indiqué je mes une constante je n'ai plus d'erreur !

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut
    J'ai remplacé mon CASE imbriqué dans le premier par un DECODE et ca fonctionne !!! je n'ai plus l'erreur ! même si je ne comprends pas pourquoi....

    Par contre il va falloir que je regarde ça de plus près car j'ai du m'emmeler les pinceaux au niveau du DECODE car je n'obtient pas le même résultat que ma requête précédente (celle avec les CASE imbriqués) sur le serveur sur lequel ma première requête fonctionnait.
    Ca donne ça :
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    SELECT ORGANIZATIONID,
           DAYPART,
           SUM(PRDNETSALES) PRDNETSALES,
           100/decode((SUBDLYGST.NETSLS/DECODE(SUM(PRDNETSALES),0,1,SUM(PRDNETSALES))),0,1,(SUBDLYGST.NETSLS/DECODE(SUM(PRDNETSALES),0,1,SUM(PRDNETSALES)))) PRDNETRATE,
           SUM(PRDGROSSSALES) PRDGROSSSALES,
           100/decode((SUBDLYGST.GROSSSLS/DECODE(SUM(PRDGROSSSALES),0,1,SUM(PRDGROSSSALES))),0,1,(SUBDLYGST.GROSSSLS/DECODE(SUM(PRDGROSSSALES),0,1,SUM(PRDGROSSSALES)))) PRDGROSSRATE,
           SUM(PRDGUESTS) PRDGUESTS,
           100/decode((SUBDLYGST.NUMGUESTS/DECODE(SUM(PRDGUESTS),0,1,SUM(PRDGUESTS))),0,1,(SUBDLYGST.NUMGUESTS/DECODE(SUM(PRDGUESTS),0,1,SUM(PRDGUESTS)))) PRDGUESTSRATE,
           SUM(PRDNETSALES)/decode(SUM(PRDGUESTS),0,1,SUM(PRDGUESTS)) PRDNETTM,
           SUM(PRDGROSSSALES)/decode(SUM(PRDGUESTS),0,1,SUM(PRDGUESTS)) PRDGROSSTM,
           TRUNC(AVG(PRDDININGTIME),0) PRDAVGDININGTIME
    FROM (SELECT    ORGANIZATIONID,
                    CASE 
                        WHEN    FIXEDPERIOD BETWEEN 25 AND 62 THEN 
                                DECODE(TO_CHAR (BUSINESSDATE,'DY'),'MON', 'Midi Semaine','TUE', 'Midi Semaine','WED', 'Midi Semaine','THU', 'Midi Semaine','FRY', 'Midi Semaine','Midi Week End')      
                        WHEN    FIXEDPERIOD BETWEEN 63 AND 72 THEN 
                                DECODE(TO_CHAR (BUSINESSDATE,'DY'),'MON', 'Midi Semaine','TUE', 'Midi Semaine','WED', 'Midi Semaine','THU', 'Midi Semaine','FRY', 'Midi Semaine','Midi Week End')
                        WHEN    (FIXEDPERIOD BETWEEN 73 AND 96) OR 
                                (FIXEDPERIOD BETWEEN 1 AND 24) THEN 
                                DECODE(TO_CHAR (BUSINESSDATE,'DY'),'MON', 'Midi Semaine','TUE', 'Midi Semaine','WED', 'Midi Semaine','THU', 'Midi Semaine','FRY', 'Midi Semaine','Midi Week End')
                    END DAYPART, 
                    NETSALESTOTAL PRDNETSALES,
                    NETSALESTOTAL - DISCOUNTTOTAL PRDGROSSSALES,
                    NUMGUESTS PRDGUESTS,
                    DININGTIME/60 PRDDININGTIME  
        FROM OPERATIONS_FIXED_PERIOD_TOTAL OFPT
        WHERE ORGANIZATIONID = 10001
            AND BUSINESSDATE = '10-mar-10'
            AND LOCATIONID = 2043 ) SUBMAIN,
            (SELECT NVL(NUMGUESTS,0) NUMGUESTS,
                     NVL(ITEMDISCOUNTTOTAL,0) DSCTTL,
                     NVL(NETSALESTOTAL,0) NETSLS,
                     NVL(NETSALESTOTAL,0) - NVL(ITEMDISCOUNTTOTAL,0) GROSSSLS
             FROM OPERATIONS_DAILY_TOTAL
             WHERE ORGANIZATIONID = 10001
                AND LOCATIONID = 2043
                AND BUSINESSDATE = '10-mar-10') SUBDLYGST 
    GROUP BY    ORGANIZATIONID,
                DAYPART,
                SUBDLYGST.NETSLS,
                SUBDLYGST.GROSSSLS,
                SUBDLYGST.NUMGUESTS

  17. #17
    Membre Expert Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Par défaut
    Bizarre, la coincidence ! J'ai eu le meme probleme hier avec une requete (si ce n'est un "DECODE" au lieu d'un case)
    J'ai résolu en faisant un "FROM DUAL"
    Essaie de remplacer
    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
    ....
    AVG(PRDDININGTIME) PRDDININGTIME
           FROM (SELECT    ORGANIZATIONID,
                    CASE 
                        WHEN    FIXEDPERIOD BETWEEN 25 AND 62 THEN 
                                CASE
                                    WHEN (TO_CHAR (BUSINESSDATE,'DY') IN ('MON','TUE','WED','THU','FRY')) OR
                                         (TO_CHAR (BUSINESSDATE,'DY') IN ('LUN.','MAR.','MER.','JEU.','VEN.')) THEN 'Midi Semaine' ELSE 'Midi Week End'
                                END        
                        WHEN    FIXEDPERIOD BETWEEN 63 AND 72 THEN 
                                CASE
                                    WHEN (TO_CHAR (BUSINESSDATE,'DY') IN ('MON','TUE','WED','THU','FRY')) OR
                                         (TO_CHAR (BUSINESSDATE,'DY') IN ('LUN.','MAR.','MER.','JEU.','VEN.')) THEN 'Après Midi Semaine' ELSE 'Après Midi Week End'
                                END
                        WHEN    (FIXEDPERIOD BETWEEN 73 AND 96) OR 
                                (FIXEDPERIOD BETWEEN 1 AND 24) THEN 
                                CASE
                                    WHEN (TO_CHAR (BUSINESSDATE,'DY') IN ('MON','TUE','WED','THU','FRY')) OR
                                         (TO_CHAR (BUSINESSDATE,'DY') IN ('LUN.','MAR.','MER.','JEU.','VEN.')) THEN 'Soir Semaine' ELSE 'Soir Week End'
                                END
                    END DAYPART, 
                    NETSALESTOTAL PRDNETSALES,
    .....
    par
    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
    AVG(PRDDININGTIME) PRDDININGTIME
           FROM (SELECT    ORGANIZATIONID,
                    (select CASE 
                        WHEN    FIXEDPERIOD BETWEEN 25 AND 62 THEN 
                                CASE
                                    WHEN (TO_CHAR (BUSINESSDATE,'DY') IN ('MON','TUE','WED','THU','FRY')) OR
                                         (TO_CHAR (BUSINESSDATE,'DY') IN ('LUN.','MAR.','MER.','JEU.','VEN.')) THEN 'Midi Semaine' ELSE 'Midi Week End'
                                END        
                        WHEN    FIXEDPERIOD BETWEEN 63 AND 72 THEN 
                                CASE
                                    WHEN (TO_CHAR (BUSINESSDATE,'DY') IN ('MON','TUE','WED','THU','FRY')) OR
                                         (TO_CHAR (BUSINESSDATE,'DY') IN ('LUN.','MAR.','MER.','JEU.','VEN.')) THEN 'Après Midi Semaine' ELSE 'Après Midi Week End'
                                END
                        WHEN    (FIXEDPERIOD BETWEEN 73 AND 96) OR 
                                (FIXEDPERIOD BETWEEN 1 AND 24) THEN 
                                CASE
                                    WHEN (TO_CHAR (BUSINESSDATE,'DY') IN ('MON','TUE','WED','THU','FRY')) OR
                                         (TO_CHAR (BUSINESSDATE,'DY') IN ('LUN.','MAR.','MER.','JEU.','VEN.')) THEN 'Soir Semaine' ELSE 'Soir Week End'
                                END FROM DUAL)
                    END DAYPART, 
                    NETSALESTOTAL PRDNETSALES,

  18. #18
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Par défaut
    Autre chose que je viens de constater, tu ne fais aucune jointure
    entes les deux sous requêtes, est ce correcte?

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut
    Citation Envoyé par Garuda Voir le message
    Bizarre, la coincidence ! J'ai eu le meme probleme hier avec une requete (si ce n'est un "DECODE" au lieu d'un case)
    J'ai résolu en faisant un "FROM DUAL"
    NICKEL ! ca fonctionne avec le FROM DUAL ! j'ai juste fait une petite correction car sans faire attention tu avais mis le deuxième END en dehors du SELECT.

    Tu me sauve la vie ! et surtout tu m'évites de terminer ma journée à 20h un vendredi soir et ca ca vaut de l'or Merci mille fois !

    Effectivement, étrange coincidence que tu ais eu le même problème hier, dieu est grand lol

    Par contre si quelqu'un a une explication rationnelle je suis preneur...

    Au final, ca donne ça :
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    SELECT ORGANIZATIONID,
           DAYPART,
           SUM(PRDNETSALES) PRDNETSALES,
           100/decode((SUBDLYGST.NETSLS/DECODE(SUM(PRDNETSALES),0,1,SUM(PRDNETSALES))),0,1,(SUBDLYGST.NETSLS/DECODE(SUM(PRDNETSALES),0,1,SUM(PRDNETSALES)))) PRDNETRATE,
           SUM(PRDGROSSSALES) PRDGROSSSALES,
           100/decode((SUBDLYGST.GROSSSLS/DECODE(SUM(PRDGROSSSALES),0,1,SUM(PRDGROSSSALES))),0,1,(SUBDLYGST.GROSSSLS/DECODE(SUM(PRDGROSSSALES),0,1,SUM(PRDGROSSSALES)))) PRDGROSSRATE,
           SUM(PRDGUESTS) PRDGUESTS,
           100/decode((SUBDLYGST.NUMGUESTS/DECODE(SUM(PRDGUESTS),0,1,SUM(PRDGUESTS))),0,1,(SUBDLYGST.NUMGUESTS/DECODE(SUM(PRDGUESTS),0,1,SUM(PRDGUESTS)))) PRDGUESTSRATE,
           SUM(PRDNETSALES)/decode(SUM(PRDGUESTS),0,1,SUM(PRDGUESTS)) PRDNETTM,
           SUM(PRDGROSSSALES)/decode(SUM(PRDGUESTS),0,1,SUM(PRDGUESTS)) PRDGROSSTM,
           TRUNC(AVG(PRDDININGTIME),0) PRDAVGDININGTIME
    FROM (SELECT    ORGANIZATIONID,
                    (select CASE 
                        WHEN    FIXEDPERIOD BETWEEN 25 AND 62 THEN 
                                CASE
                                    WHEN (TO_CHAR (BUSINESSDATE,'DY') IN ('MON','TUE','WED','THU','FRY')) OR
                                         (TO_CHAR (BUSINESSDATE,'DY') IN ('LUN.','MAR.','MER.','JEU.','VEN.')) THEN 'Midi Semaine' ELSE 'Midi Week End'
                                END        
                        WHEN    FIXEDPERIOD BETWEEN 63 AND 72 THEN 
                                CASE
                                    WHEN (TO_CHAR (BUSINESSDATE,'DY') IN ('MON','TUE','WED','THU','FRY')) OR
                                         (TO_CHAR (BUSINESSDATE,'DY') IN ('LUN.','MAR.','MER.','JEU.','VEN.')) THEN 'Après Midi Semaine' ELSE 'Après Midi Week End'
                                END
                        WHEN    (FIXEDPERIOD BETWEEN 73 AND 96) OR 
                                (FIXEDPERIOD BETWEEN 1 AND 24) THEN 
                                CASE
                                    WHEN (TO_CHAR (BUSINESSDATE,'DY') IN ('MON','TUE','WED','THU','FRY')) OR
                                         (TO_CHAR (BUSINESSDATE,'DY') IN ('LUN.','MAR.','MER.','JEU.','VEN.')) THEN 'Soir Semaine' ELSE 'Soir Week End'
                                END END from dual) DAYPART, 
                    NETSALESTOTAL PRDNETSALES,
                    NETSALESTOTAL - DISCOUNTTOTAL PRDGROSSSALES,
                    NUMGUESTS PRDGUESTS,
                    DININGTIME/60 PRDDININGTIME  
        FROM OPERATIONS_FIXED_PERIOD_TOTAL OFPT
        WHERE ORGANIZATIONID = 10001
            AND BUSINESSDATE = '10-mar-10'
            AND LOCATIONID = 2043 ) SUBMAIN,
            (SELECT NVL(NUMGUESTS,0) NUMGUESTS,
                     NVL(ITEMDISCOUNTTOTAL,0) DSCTTL,
                     NVL(NETSALESTOTAL,0) NETSLS,
                     NVL(NETSALESTOTAL,0) - NVL(ITEMDISCOUNTTOTAL,0) GROSSSLS
             FROM OPERATIONS_DAILY_TOTAL
             WHERE ORGANIZATIONID = 10001
                AND LOCATIONID = 2043
                AND BUSINESSDATE = '10-mar-10') SUBDLYGST 
    GROUP BY    ORGANIZATIONID,
                DAYPART,
                SUBDLYGST.NETSLS,
                SUBDLYGST.GROSSSLS,
                SUBDLYGST.NUMGUESTS

  20. #20
    Membre Expert Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Par défaut
    Super !
    Et merci pour le compliment !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. ORA-00979: not a GROUP BY expression
    Par Oratorio dans le forum Oracle
    Réponses: 6
    Dernier message: 16/11/2012, 10h21
  2. ORA-00979:not a GROUP BY expression
    Par kodo dans le forum SQL
    Réponses: 2
    Dernier message: 16/12/2010, 19h11
  3. not a group by expression
    Par pseudobidon57 dans le forum SQL
    Réponses: 2
    Dernier message: 15/04/2007, 01h53
  4. ORA-00979: not a GROUP BY expression
    Par Wurlitzer dans le forum Oracle
    Réponses: 13
    Dernier message: 01/02/2007, 13h19
  5. Erreur ORA-00979 : not a GROUP BY expression sur Oracle9i
    Par Dirty Henry dans le forum Oracle
    Réponses: 9
    Dernier message: 21/10/2005, 15h23

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