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 07/01/2008, 17h55   #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 mise à jour de champs dans une table à partir de calculs sur une autre table

Re-bonjour à tous,

J'ai de nouveau un petit pb d'écriture de requête SQL.

Voici la structure de mes tables :

maTable1 : annee, mois, id_lieu, id_num, Val
avec des enregistrements du style
Citation:
2007, 01, A, aa, 15
2007, 01, C, ret, 0
2007, 10, C, ab, 0
2007, 12, A, rfd, 0
2007, 12, A, de, 1
2007, 12, B, a, 5
maTable2 : annee, id_lieu, nbNumTot, sumValTot, nbNum, sumVal

J'aimerais renseigner maTable2 en sachant que
Code :
1
2
3
4
 nbNumTot=count(id_num)
  sumValTot=sum(Val)
  nbNum=count(id_num) si mois=12
  sumVal=sum(Val) si mois=12
afin d'obtenir le résultat suivant:
Citation:
2007, A, 3, 16, 2, 1
2007, C, 2, 0, 0, 0
2007, B, 1, 5, 1, 5
J'ai commencé par écrire une requête qui me permet d'ajouter dans la table les informations nbNumTot et sumValTot, c'est à dire que j'obtiens le résultat suivant:
Citation:
2007, 1, 3, 16, 0, 0
2007, 5, 2, 0, 0, 0
2007, 3, 1, 5, 0, 0
Je cherche maintenant à écrire la requête qui me permet de mettre à jour ces enregistrements pour les champs nbNum et sumVal.

Je suppose qu'il doit être possible de faire le travail en 1 seule requête, mais je n'arrive pas à trouver la solution.

Pouvez-vous m'aider ?
Je suis sur Oracle 10g et je travaille à partir de sql developer.

Merci à tous,
MarieO
marieo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 18h08   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
et ce serait trop demandé d'avoir la requête en question ?

Merci de penser aux balises QUOTE et CODE

As-tu regarder du coté des fonctions analytiques ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 18h13   #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
Pardon, j'ai effectivement oublié de mettre la requête concernée ;-)

Code :
1
2
3
4
5
 
INSERT INTO maTable2 (annee, id_lieu, nbNumTot, sumValTot)
SELECT annee, id_lieu, count(id_num), sum(Val)
FROM maTable1
GROUP BY annee, id_lieu
MarieO
marieo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 18h17   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
et pourquoi ça marche pas ça ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 18h31   #5
Futur Membre du Club
 
Inscription : mai 2006
Messages : 65
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 65
Points : 17
Points : 17
Cette requête fonctionne.
Ce que je n'arrive pas à faire, c'est écrire la requête qui met à jour les données de la table maTable2 (pour les champs nbNum et sumVal) à partir de maTable1.

Données dans maTable1
Code :
1
2
3
4
5
6
7
8
9
10
11
 
maTable1 : annee, mois, id_lieu, id_num, Val
2007, 01, A, aa, 15
2007, 01, C, ret, 0
2007, 10, C, ab, 0
2007, 12, A, rfd, 0
2007, 12, A, de, 1
2007, 12, B, a, 5
 
maTable2 : maTable2 : annee, id_lieu, nbNumTot, sumValTot, nbNum, sumVal
vide pour le moment
Après la requête
Code :
1
2
3
4
5
 
INSERT INTO maTable2 (annee, id_lieu, nbNumTot, sumValTot)
SELECT annee, id_lieu, count(id_num), sum(Val)
FROM maTable1
GROUP BY annee, id_lieu;
J'ai alors maTable2 qui contient les enregistrements
Code :
1
2
3
4
5
 
annee, id_lieu, nbNumTot, sumValTot, nbNum, sumVal
  2007, 1, 3, 16, 0, 0
  2007, 5, 2, 0, 0, 0
  2007, 3, 1, 5, 0, 0
Je souhaite écrire la requête qui met à jour les données de maTable2 et me permet d'avoir comme résultat dans maTable2
Code :
1
2
3
4
5
 
annee, id_lieu, nbNumTot, sumValTot, nbNum, sumVal
2007, A, 3, 16, 2, 1
2007, C, 2, 0, 0, 0
2007, B, 1, 5, 1, 5
marieo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 18h32   #6
Futur Membre du Club
 
Inscription : mai 2006
Messages : 65
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 65
Points : 17
Points : 17
Oups,
il faut lire
Code :
1
2
3
4
5
 
annee, id_lieu, nbNumTot, sumValTot, nbNum, sumVal
  2007, A, 3, 16, 0, 0
  2007, C, 2, 0, 0, 0
  2007, B, 1, 5, 0, 0
après la requête d'insertion des résultats...

MarieO
marieo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 18h35   #7
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
ajoute COUNT () OVER et SUM () OVER qui vont bien dans ta requête d'insertion... pour la 2° fois : regarde du coté des fonctions analytiques
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 19h59   #8
Membre Expert
 
Homme
Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)
Inscription : mars 2003
Messages : 645
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 41
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)

Informations forums :
Inscription : mars 2003
Messages : 645
Points : 1 165
Points : 1 165
Citation:
Envoyé par marieo Voir le message
Cette requête fonctionne.
Ce que je n'arrive pas à faire, c'est écrire la requête qui met à jour les données de la table maTable2 (pour les champs nbNum et sumVal) à partir de maTable1.
Tu parles de mise à jour (UPDATE) ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
UPDATE maTable2 
SET (annee, id_lieu, nbNumTot, sumValTot)=
   (SELECT annee, id_lieu, count(id_num), sum(Val)
   FROM maTable1
   WHERE annee=maTable2.annee AND   id_lieu=maTable2. id_lieu
   GROUP BY annee, id_lieu
   )
WHERE--pour éviter de mettre des nulls dans les lignes de maTable2 n'ayant pas d'occurences dans maTable1
 (annee, id_lieu)IN 
   (SELECT annee, id_lieu
    FROM maTable1
    GROUP BY annee, id_lieu
   )
phili_b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 20h18   #9
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
sauf qu'en faisant l'INSERT correctement il s'évite un UPDATE rendu inutile
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 10h15   #10
Futur Membre du Club
 
Inscription : mai 2006
Messages : 65
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 65
Points : 17
Points : 17
J'ai bien tenté d'écrire la requête suivante mais j'ai un message d'erreur
"ORA-00979 n'est pas une expression group by"
Code :
1
2
3
4
5
 
INSERT INTO maTable2 (annee, id_lieu, nbNumTot, sumValTot,nbNum,sumVal)
SELECT annee, id_lieu, count(id_num), sum(Val), count(id_num) over(partition BY annee,id_lieu ORDER BY mois range 12), sum(val) over (partition BY annee,id_lieu ORDER BY mois range 12)
FROM maTable1
GROUP BY annee, id_lieu;
La solution du UPDATE fonctionne mais c'est vrai qu'il faut alors faire 2 requêtes au lieu d'une seule.

Quelqu'un aurait-il une solution à me proposer ?

Merci à tous
MarieO
marieo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 11h04   #11
Membre Expert
 
Homme
Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)
Inscription : mars 2003
Messages : 645
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 41
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)

Informations forums :
Inscription : mars 2003
Messages : 645
Points : 1 165
Points : 1 165
et quelque chose comme cela ?:

Code :
1
2
3
4
5
6
7
8
INSERT INTO maTable2 (annee, id_lieu, nbNumTot, sumValTot,nbNum,sumVal)
SELECT annee, id_lieu, count(id_num),sum(Val), nbNum,sumVal
FROM (
     SELECT annee, id_lieu,  count(id_num) over(partition BY annee,id_lieu ORDER BY mois range 12) nbNum, 
     sum(val) over (partition BY annee,id_lieu ORDER BY mois range 12) sumVal
     FROM maTable1
     )
GROUP BY annee, id_lieu,nbNum,sumVal;
phili_b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 11h36   #12
Futur Membre du Club
 
Inscription : mai 2006
Messages : 65
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 65
Points : 17
Points : 17
Ca ne fonctionne pas.
j'ai le message d'erreur "missing keyword".

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 14h12.


 
 
 
 
Partenaires

Hébergement Web