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 :

optimisation d'une mise à jour d'une table à partir de calculs sur une autre table


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 115
    Points : 59
    Points
    59
    Par défaut optimisation d'une mise à jour d'une table à partir de calculs sur une autre table
    Bonjour à tous,

    J'ai de nouveau une question sur une requête de mise à jour de données

    Mes données sources sont stockées dans 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
     
    --Table initiale des données
     
    CREATE TABLE TABLEDONNEES
     (ANNEE VARCHAR2(4), ETB VARCHAR2(2), ID_NUM NUMBER, 
      TYPE VARCHAR2(1), STATUT VARCHAR2(2),
      NB1 NUMBER, NB2 NUMBER, NB3 NUMBER, NB4 NUMBER);
     
    INSERT INTO TABLEDONNEES(ANNEE, ETB, ID_NUM, TYPE, STATUT, NB1, NB2, NB3, NB4)
    VALUES ('2007','AA',1,'H','NN',1,0,1,0);
    INSERT INTO TABLEDONNEES(ANNEE, ETB, ID_NUM, TYPE, STATUT, NB1, NB2, NB3, NB4)
    VALUES ('2007','AA',2,'H','NX',0,0,1,0);  
    INSERT INTO TABLEDONNEES(ANNEE, ETB, ID_NUM, TYPE, STATUT, NB1, NB2, NB3, NB4)
    VALUES ('2007','AA',3,'S','NN',0,0,1,5);
    INSERT INTO TABLEDONNEES(ANNEE, ETB, ID_NUM, TYPE, STATUT, NB1, NB2, NB3, NB4)
    VALUES ('2007','AA',4,'S','NN',1,12,1,12);
    INSERT INTO TABLEDONNEES(ANNEE, ETB, ID_NUM, TYPE, STATUT, NB1, NB2, NB3, NB4)
    VALUES ('2007','AB',1,'H','NN',1,0,1,0);
    INSERT INTO TABLEDONNEES(ANNEE, ETB, ID_NUM, TYPE, STATUT, NB1, NB2, NB3, NB4)
    VALUES ('2007','AB',2,'H','NX',1,0,1,0);
    INSERT INTO TABLEDONNEES(ANNEE, ETB, ID_NUM, TYPE, STATUT, NB1, NB2, NB3, NB4)
    VALUES ('2007','AB',3,'S','NN',1,4,1,4);
    INSERT INTO TABLEDONNEES(ANNEE, ETB, ID_NUM, TYPE, STATUT, NB1, NB2, NB3, NB4)
    VALUES ('2007','AB',4,'S','NN',0,0,1,20);
    Je cherche à calculer et à stocker dans une 2ème table pour chaque ANNEE, pour chaque ETB et par TYPE des sommes de NB1, NB2, NB3 et NB4 selon STATUT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    --Table de stockage des résultats
    CREATE TABLE TABLERESULT
     (ANNEE VARCHAR2(4), ETB VARCHAR2(2), TYPE VARCHAR2(1), NB1_NN NUMBER, NB1_NX NUMBER, NB2_NN NUMBER, NB2_NX NUMBER, NB3_NN NUMBER, NB3_NX NUMBER, NB4_NN NUMBER, NB4_NX NUMBER);
    J'ai d'abord écrit une requête qui récupère pour chaque ANNEE, chaque ETB, chaque TYPE et chaque STATUT les sommes NB1, NB2, NB3 et NB4.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT annee, etb, type, statut, SUM(nb1) AS nb1, SUM(nb2) AS nb2, SUM(nb3) AS nb3, SUM(nb4) AS nb4
    FROM tabledonnees
    GROUP BY annee, etb, type, statut;
    Je n'arrive pas à écrire une requête qui insert une seule ligne par ANNEE, ETB et TYPE dans la table TABLERESULT avec les 8 NB* différents.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    --Table finale que j'aimerais obtenir
     
    ANNEE, ETB, TYPE, NB1_NN, NB1_NX, NB2_NN, NB2_NX, NB3_NN, NB3_NX, NB4_NN, NB4_NX
    ---------------------------------------------------------------------------------------
    2007,AA,H,1,0,0,0,1,1,0,0
    2007,AA,S,1,0,12,0,2,0,17,0
    2007,AB,H,1,1,0,0,1,1,0,0
    2007,AB,S,1,0,4,0,2,0,24,0
    Pourriez-vous m'aider ?
    Merci à tous pour les bonnes idées que vous pourrez avoir.

    MarieO

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par marieo Voir le message
    Bonjour à tous,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT annee, etb, type, statut, SUM(nb1) AS nb1, SUM(nb2) AS nb2, SUM(nb3) AS nb3, SUM(nb4) AS nb4
    FROM tabledonnees
    GROUP BY annee, etb, type, statut;
    Je n'arrive pas à écrire une requête qui insert une seule ligne par ANNEE, ETB et TYPE dans la table TABLERESULT avec les 8 NB* différents.

    Pourriez-vous m'aider ?
    Merci à tous pour les bonnes idées que vous pourrez avoir.

    MarieO
    Exemple ci-après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT annee, etb, type, statut,
      SUM(case when type = 'NN' then nb1 else 0 end) AS nb1_nn,
      SUM(case when type = 'NX' then nb1 else 0 end) AS nb1_nx,
      ...
    FROM tabledonnees
    GROUP BY annee, etb, type, statut;
    Consultant et formateur Oracle

  3. #3
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 115
    Points : 59
    Points
    59
    Par défaut
    Bonjour,

    Merci beaucoup, ça marche !!!

    et dire que j'ai passé presque toute la journée à essayer de trouver en me compliquant la tête alors que la solution proposée est d'une simplicité terrifiante !!!

    Il suffisait d'y penser.

    Quoi qu'il en soit, merci beaucoup pour avoir pris le temps de comprendre mon pb et d'y avoir répondu avec autant d'efficacité.

    MarieO

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/02/2014, 23h43
  2. Réponses: 1
    Dernier message: 04/11/2011, 11h30
  3. Réponses: 0
    Dernier message: 04/11/2011, 10h58
  4. Réponses: 1
    Dernier message: 13/03/2008, 15h57
  5. Réponses: 11
    Dernier message: 08/01/2008, 11h36

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