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 :

PB Pourcentage Sur requête avec SUM et GROUP BY


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 46
    Points : 31
    Points
    31
    Par défaut PB Pourcentage Sur requête avec SUM et GROUP BY
    Bonjour tout le monde,

    Mon problème est que je veux les pourcentages de rebuts par motif, machine, worcenter et par semaine.

    La requête suivante fonction bien sans le rajout du pourcentage. Avec ce code avec pourcentage j'obtiens une erreur "ORA-00979: not a GROUP BY expression"

    Help me please

    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
    SELECT   TO_CHAR(SG_MOVEMENT1.POSTDATE,'IW') AS SEMAINE,
    		 SG_MOVEMENT1.PRODUCTIONLINE AS WORKCENTER, 
    		 SG_MOVEMENT1.MACHINE AS MACHINE, 
    		 TEXT_TRANSLATION.MEDIUM AS MOTIF, 
    		 SUM(SG_MOVEMENT1.QUANTITY) AS REBUTS,
    		 SUM(SG_MOVEMENT1.QUANTITY)*100/Tot.SommeRebuts AS POURCENTAGE
    FROM     USR560.SG_MOVEMENT SG_MOVEMENT1,
    		 USR560.REASON_CODE REASON_CODE, 
    		 USR560.TEXT_TRANSLATION TEXT_TRANSLATION ,
    		 (SELECT SUM(SG_MOVEMENT.QUANTITY) AS SommeRebuts 
    		 		 FROM USR560.SG_MOVEMENT 
    				 WHERE SG_MOVEMENT.TRANSACTIONCODE IN (n'0') 
    				 AND SG_MOVEMENT.STATUS IN (n'1') 
    				 GROUP BY TO_CHAR(SG_MOVEMENT.POSTDATE,'IW'),SG_MOVEMENT.PRODUCTIONLINE, SG_MOVEMENT.MACHINE) Tot
    WHERE    SG_MOVEMENT1.REASONCODE=REASON_CODE.REASONCODE 
    		 AND      REASON_CODE.TEXTID=TEXT_TRANSLATION.TEXTID 
             AND      TEXT_TRANSLATION.LANGUAGEID IN (n'1033') 
             AND      SG_MOVEMENT1.TRANSACTIONCODE IN (n'0')
    		 AND 	  SG_MOVEMENT1.STATUS IN (n'1') 
             AND      SG_MOVEMENT1.POSTDATE BETWEEN TO_DATE('10/04/2009 05:00','DD/MM/YYYY HH24:MI') 
    		 		  						AND TO_DATE('21/04/2009 13:00','DD/MM/YYYY HH24:MI')
    GROUP BY TO_CHAR(SG_MOVEMENT1.POSTDATE,'IW'),SG_MOVEMENT1.PRODUCTIONLINE, SG_MOVEMENT1.MACHINE, TEXT_TRANSLATION.MEDIUM
    Merci d'avance

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Peut être que ceci vous donnera le résultat recherché :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUM(SG_MOVEMENT1.QUANTITY)*100/AVG(Tot.SommeRebuts) AS POURCENTAGE
    J'admets ne pas avoir cherché trop longtemps, une requête conséquente sans structure des tables et sans jointures normalisées, c'est pas très compréhensible.

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Rajouter Tot.SommeRebuts dans le group by devrait fonctionner également.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 46
    Points : 31
    Points
    31
    Par défaut
    Merci pour vos réponses j'ai essayé mais en vain, pas parce que la requête bug mais parce que ça ne donne pas les résultats escomptés.

    C'est à dire j'aurais souhaitais avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SEMAINE | WORKCENTER | MACHINE | MOTIF | REBUTS | POURCENTAGE
    1          WORK1       MACH1     PB1        5         10
    1          WORK1       MACH1     PB2        30        60
    1          WORK1       MACH2     PB3        15        30
    1          WORK2       MACH21    PB1        10        100
    2
    3
    ....
    et là j'ai des valeurs supérieur à 100% et en plus de ça les enregistrements sont tous répétés un à un .

    merci d'avance

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Il faut joindre ta sous-requete "Tot" avec le reste.
    Dans cette sous requête tu calcules la somme groupée par (TO_CHAR(SG_MOVEMENT.POSTDATE,'IW'),SG_MOVEMENT.PRODUCTIONLINE, SG_MOVEMENT.MACHINE).
    Or tu ne selectionnes que la somme, et pas les colonnes qui vont te permettre de la joindre avec le reste de ta requête, ça te fait donc un produit cartésien avec les valeurs renvoyées par ta sous requête.
    Ca donnerait quelque chose comme ça en ecrivant les jointures normalisées :
    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
     
    SELECT   To_char(sg_movement1.postdate,'IW')                AS semaine,
             sg_movement1.productionline                        AS workcenter,
             sg_movement1.machine                               AS machine,
             text_translation.medium                            AS motif,
             Sum(sg_movement1.quantity)                         AS rebuts,
             Sum(sg_movement1.quantity) * 100/tot.sommerebuts AS pourcentage
    FROM usr560.sg_movement sg_movement1  
    JOIN usr560.reason_code reason_code
         ON sg_movement1.reasoncode = reason_code.reasoncode
    JOIN usr560.text_translation text_translation
         ON reason_code.textid = text_translation.textid
    JOIN (SELECT   To_char(sg_movement.postdate,'IW') as semaine, sg_movement.productionline, sg_movement.machine, Sum(sg_movement.quantity) AS sommerebuts
          FROM     usr560.sg_movement
          WHERE    sg_movement.transactioncode IN (n'0')
            AND sg_movement.status IN (n'1')
          GROUP BY To_char(sg_movement.postdate,'IW'),
                   sg_movement.productionline,
                   sg_movement.machine
         ) tot
         ON tot.semaine = To_char(sg_movement1.postdate,'IW')
    	 AND tot.productionline = sg_movement1.productionline
    	 AND tot.machine = sg_movement1.machine
    WHERE text_translation.languageid IN (n'1033')
      AND sg_movement1.transactioncode IN (n'0')
      AND sg_movement1.status IN (n'1')
      AND sg_movement1.postdate BETWEEN To_date('10/04/2009 05:00','DD/MM/YYYY HH24:MI') AND To_date('21/04/2009 13:00','DD/MM/YYYY HH24:MI')
    GROUP BY To_char(sg_movement1.postdate,'IW'),
             sg_movement1.productionline,
             sg_movement1.machine,
             text_translation.medium,
             tot.sommerebuts
    Ou alors j'ai pas bien compris ce que tu veux, et il faut simplement enlever le groupement de ta sous-requête pour obtenir un total global.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 46
    Points : 31
    Points
    31
    Par défaut
    j'ai une erreur sur le JOIN :"ORA-00933: SQL command not properly ended".
    je suis sous oracle y - a -t il une relation

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Il n'y a aucun problème avec cette syntaxe sous Oracle.
    Qu'est ce qui vous fait dire que cette erreur vient du JOIN?

    Au passage, quelle est votre version d'Oracle?

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 46
    Points : 31
    Points
    31
    Par défaut
    une v8 je crois
    je pense que cela vient de la car TOAD attend quelque chose et il fait l'erreur et il n'a pas l'air de reconnaitre le JOIN

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 46
    Points : 31
    Points
    31
    Par défaut
    Rebonjour et merci pour votre aide après quelques recherches le JOIN n'est interprété qu'à partir de la version 9i et moi je suis en 8i.
    Mais effectivement snipah ton code était bon et c'est bien ça que je voulais obtenir.
    Voici ton code sans jointure normalisé :

    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   TO_CHAR(SG_MOVEMENT1.POSTDATE,'IW')                AS SEMAINE,
             SG_MOVEMENT1.PRODUCTIONLINE                        AS WORKCENTER,
             SG_MOVEMENT1.MACHINE                               AS MACHINE,
             TEXT_TRANSLATION.MEDIUM                            AS MOTIF,
             SUM(SG_MOVEMENT1.QUANTITY)                         AS REBUTS,
             ROUND(SUM(SG_MOVEMENT1.QUANTITY) * 100/TOT.SOMMEREBUTS,2) AS POURCENTAGE
    FROM USR560.SG_MOVEMENT SG_MOVEMENT1, 
         USR560.REASON_CODE REASON_CODE,
         USR560.TEXT_TRANSLATION TEXT_TRANSLATION,
    	 (SELECT   TO_CHAR(SG_MOVEMENT.POSTDATE,'IW') AS SEMAINE, 
    	 		   SG_MOVEMENT.PRODUCTIONLINE, 
    			   SG_MOVEMENT.MACHINE, 
    			   SUM(SG_MOVEMENT.QUANTITY) AS SOMMEREBUTS
          FROM     USR560.SG_MOVEMENT
          WHERE    SG_MOVEMENT.TRANSACTIONCODE IN (N'0')
           AND SG_MOVEMENT.STATUS IN (N'1')
          GROUP BY TO_CHAR(SG_MOVEMENT.POSTDATE,'IW'),
                   SG_MOVEMENT.PRODUCTIONLINE,
                   SG_MOVEMENT.MACHINE
         ) TOT
    WHERE TEXT_TRANSLATION.LANGUAGEID IN (N'1033')
      AND SG_MOVEMENT1.REASONCODE = REASON_CODE.REASONCODE
      AND REASON_CODE.TEXTID = TEXT_TRANSLATION.TEXTID
      AND SG_MOVEMENT1.TRANSACTIONCODE IN (N'0')
      AND SG_MOVEMENT1.STATUS IN (N'1')
      AND TOT.SEMAINE = TO_CHAR(SG_MOVEMENT1.POSTDATE,'IW')
      AND TOT.PRODUCTIONLINE = SG_MOVEMENT1.PRODUCTIONLINE
      AND TOT.MACHINE = SG_MOVEMENT1.MACHINE
      AND SG_MOVEMENT1.POSTDATE BETWEEN TO_DATE('05/01/2009 00:00','DD/MM/YYYY HH24:MI') AND TO_DATE('31/12/2009 23:59','DD/MM/YYYY HH24:MI')
    GROUP BY TO_CHAR(SG_MOVEMENT1.POSTDATE,'IW'),
             SG_MOVEMENT1.PRODUCTIONLINE,
             SG_MOVEMENT1.MACHINE,
             TEXT_TRANSLATION.MEDIUM,
             TOT.SOMMEREBUTS
    En tout cas un grand merci

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Oui, Oracle 8 commence à date, et ils étaient un peu en retard sur la norme...

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 20/01/2011, 13h45
  2. [MySQL] Jointure externe sur requête avec MySQL
    Par ginkas31 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 01/02/2008, 12h02
  3. [SQL] Jointure de table avec SUM et GROUP BY
    Par waterjetmedia dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 20/09/2007, 14h17
  4. requête avec SUM
    Par jeanfi77 dans le forum Requêtes
    Réponses: 1
    Dernier message: 07/05/2007, 19h03
  5. [SQLServer] Requête avec SUM
    Par FzF dans le forum Langage SQL
    Réponses: 3
    Dernier message: 18/05/2006, 17h19

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