Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/01/2008, 15h12   #1
Futur Membre du Club
 
Inscription : mai 2006
Messages : 65
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 65
Points : 17
Points : 17
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 :
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 :
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 :
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 :
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
marieo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 20h14   #2
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

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

Code :
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 :
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;
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2008, 10h56   #3
Futur Membre du Club
 
Inscription : mai 2006
Messages : 65
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 65
Points : 17
Points : 17
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
marieo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h25.


 
 
 
 
Partenaires

Hébergement Web