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 :

Opération arithmétique : optimisation


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Points : 34
    Points
    34
    Par défaut Opération arithmétique : optimisation
    Bonjour,
    j'ai la table suivante
    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
     
    CREATE TABLE TEST_CALCUL (  ANNEE NUMBER(4,0) ,MOIS NUMBER(2,0),ID_EMPLOYE VARCHAR2(08) , CODE VARCHAR2(10), SOUS_CODE VARCHAR2(10),VALEUR1 NUMBER(10,2) , VALEUR2 NUMBER(10,2) , VALEUR3 NUMBER(10,2),PRIMARY KEY (ANNEE,MOIS,ID_EMPLOYE,CODE,SOUS_CODE))
    Insert into TEST_CALCUL (ANNEE,MOIS,ID_EMPLOYE,CODE,SOUS_CODE,VALEUR1,VALEUR2,VALEUR3) values ('2012','10','EMP01','CODE1','Q','1','2','3');
    Insert into TEST_CALCUL (ANNEE,MOIS,ID_EMPLOYE,CODE,SOUS_CODE,VALEUR1,VALEUR2,VALEUR3) values ('2012','10','EMP01','CODE2','W','4','5','6');
    Insert into TEST_CALCUL (ANNEE,MOIS,ID_EMPLOYE,CODE,SOUS_CODE,VALEUR1,VALEUR2,VALEUR3) values ('2012','10','EMP01','CODE3','D','7','8','9');
    Insert into TEST_CALCUL (ANNEE,MOIS,ID_EMPLOYE,CODE,SOUS_CODE,VALEUR1,VALEUR2,VALEUR3) values ('2012','10','EMP02','CODE1','D','10','11','12');
    Insert into TEST_CALCUL (ANNEE,MOIS,ID_EMPLOYE,CODE,SOUS_CODE,VALEUR1,VALEUR2,VALEUR3) values ('2012','10','EMP02','CODE3','F','13','14','15');
    Insert into TEST_CALCUL (ANNEE,MOIS,ID_EMPLOYE,CODE,SOUS_CODE,VALEUR1,VALEUR2,VALEUR3) values ('2012','10','EMP02','CODE3','D','16','17','18');
    Insert into TEST_CALCUL (ANNEE,MOIS,ID_EMPLOYE,CODE,SOUS_CODE,VALEUR1,VALEUR2,VALEUR3) values ('2012','10','EMP02','CODE3','X','19','20','21');
    Insert into TEST_CALCUL (ANNEE,MOIS,ID_EMPLOYE,CODE,SOUS_CODE,VALEUR1,VALEUR2,VALEUR3) values ('2012','10','EMP02','CODE4','X','22','23','24');
    Insert into TEST_CALCUL (ANNEE,MOIS,ID_EMPLOYE,CODE,SOUS_CODE,VALEUR1,VALEUR2,VALEUR3) values ('2012','10','EMP02','CODE5','X','25','26','27');
    Insert into TEST_CALCUL (ANNEE,MOIS,ID_EMPLOYE,CODE,SOUS_CODE,VALEUR1,VALEUR2,VALEUR3) values ('2012','10','EMP01','CODE4','X','28','29','30');
    Insert into TEST_CALCUL (ANNEE,MOIS,ID_EMPLOYE,CODE,SOUS_CODE,VALEUR1,VALEUR2,VALEUR3) values ('2012','10','EMP01','CODE5','X','31','32','33');
    ANNEE MOIS ID_EMPLOYE CODE       SOUS_CODE     VALEUR1    VALEUR2    VALEUR3
    ----- ---- ---------- ---------- ---------- ---------- ---------- ----------
     2012   10 EMP01      CODE1      Q                   1          2          3 
     2012   10 EMP01      CODE2      W                   4          5          6 
     2012   10 EMP01      CODE3      D                   7          8          9 
     2012   10 EMP02      CODE1      D                  10         11         12 
     2012   10 EMP02      CODE3      F                  13         14         15 
     2012   10 EMP02      CODE3      D                  16         17         18 
     2012   10 EMP02      CODE3      X                  19         20         21 
     2012   10 EMP02      CODE4      X                  22         23         24 
     2012   10 EMP02      CODE5      X                  25         26         27 
     2012   10 EMP01      CODE4      X                  28         29         30 
     2012   10 EMP01      CODE5      X                  31         32         33
    et le but est d'obtenir le résultat suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ANNEE MOIS ID_EMPLOYE 'STOCK1' 'STOCK2'
    ----- ---- ---------- -------- --------
     2012   10 EMP01             5        4 
     2012   10 EMP02            64        4
    sachant que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    STOCK1=(VALEUR1 DE CODE1)-(VALEUR2 DE CODE2)+(VALEUR3 DE CODE3)
    STOCK2=-(VALEUR2 DE CODE4)+(VALEUR3 DE CODE5)
    Avez-vous une méthode plus performante que celle-ci?

    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
    WITH TABLE1 AS (
    SELECT ANNEE ,MOIS  ,ID_EMPLOYE ,CODE,SUM(VALEUR1) AS VALEUR1,SUM(VALEUR2) AS VALEUR2,SUM(VALEUR3) AS VALEUR3
    FROM TEST_CALCUL 
    WHERE 
    ANNEE = 2012 AND MOIS = 10 
    AND CODE IN ('CODE1','CODE2','CODE3','CODE4','CODE5')
    GROUP BY ANNEE ,MOIS  ,ID_EMPLOYE ,CODE
    )
    ,TABLE2 AS (
    SELECT ANNEE ,MOIS ,ID_EMPLOYE  ,'STOCK1' AS CODE, VALEUR1 AS VALEUR FROM TABLE1 WHERE  CODE = 'CODE1'
    UNION
    SELECT ANNEE ,MOIS ,ID_EMPLOYE  ,'STOCK1' AS CODE, VALEUR2*-1 AS VALEUR FROM TABLE1 WHERE  CODE = 'CODE2'
    UNION
    SELECT ANNEE ,MOIS ,ID_EMPLOYE  ,'STOCK1' AS CODE, VALEUR3 AS VALEUR FROM TABLE1 WHERE  CODE = 'CODE3'
    UNION
    SELECT ANNEE ,MOIS ,ID_EMPLOYE  ,'STOCK2' AS CODE, VALEUR2*-1 AS VALEUR FROM TABLE1 WHERE  CODE = 'CODE4'
    UNION
    SELECT ANNEE ,MOIS ,ID_EMPLOYE  ,'STOCK2' AS CODE, VALEUR3 AS VALEUR FROM TABLE1 WHERE  CODE = 'CODE5'
    )
    SELECT * FROM TABLE2 PIVOT (SUM(VALEUR) FOR CODE IN ('STOCK1','STOCK2'));

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Avec un decode et une fonction de groupe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT annee, mois, id_employe, 
    		SUM(DECODE(code, 'CODE1', valeur1, 0)) 
    	- SUM(DECODE(code, 'CODE2', valeur3, 0)) 
    	+ SUM(DECODE(code, 'CODE3', valeur3, 0)) stock1,
      	SUM(DECODE(code, 'CODE5', valeur3, 0)) 
    	- SUM(DECODE(code, 'CODE4', valeur2, 0)) stock2
    FROM test_calcul
    GROUP BY annee, mois, id_employe
     
    ANNEE	MOIS	ID_EMPLOYE	STOCK1	STOCK2
    2012	10	EMP01		4	4
    2012	10	EMP02		64	4
    Et tu as une erreur dans ton résultat : C'est 4 le premier résultat : 1 - 5 + 8

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Points : 18 395
    Points
    18 395
    Par défaut
    Citation Envoyé par McM Voir le message
    Et tu as une erreur dans ton résultat : C'est 4 le premier résultat : 1 - 5 + 8
    C'est une erreur dans le decode : valeur3 au lieu de valeur2 dans la ligne 3.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Points : 34
    Points
    34
    Par défaut
    Merci et comme dirait l'autre "parfaitement parfait"

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

Discussions similaires

  1. Opération arithmétique dans un select
    Par Christophe Charron dans le forum Requêtes
    Réponses: 3
    Dernier message: 21/03/2007, 12h19
  2. Réponses: 5
    Dernier message: 17/06/2006, 13h33
  3. Opération arithmétique de String à Float
    Par Shiryu57 dans le forum Langage
    Réponses: 4
    Dernier message: 13/03/2006, 11h22
  4. Réponses: 6
    Dernier message: 28/07/2005, 22h14
  5. [VAL] Opérations arithmétiques
    Par WriteLN dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/05/2005, 10h59

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