Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels 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/06/2011, 11h14   #1
Invité de passage
 
Inscription : janvier 2010
Messages : 21
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 21
Points : 4
Points : 4
Par défaut Mise à jour de colonne et cumul des quantités

Bonjour, j'implore votre aide pour une requête sql qui me fais tourner la tete il y'a pas mal de temps, j'ai une table cmd(ncmd, nart, qtit) je veux que quand elle trouve deux nart semblable elle m'additionne la leur qtit et voila la requete que j'ai fais

Code :
1
2
3
4
5
UPDATE cmd
 SET qtit =( SELECT e1.qtit, e2.qtit
                FROM cmd e1 , cmd e2
               WHERE e1.nart=e2.nart
                      AND e1.ncmd <> e2.ncmd);
mais ca marche pas . quelqu'un a une idée?
butterflie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2011, 11h36   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
C'est clair que ça va pas marcher :
1 : 1 colonne = select de 2 valeurs !
2 : Aucun lien entre la sous requête et la table updatée
3 : Et si jamais il y a 3 lignes avec le même nart : Erreur Too_many_rows

Code :
1
2
3
UPDATE cmd a
SET qtit = (SELECT sum(b.qtit) FROM cmd b WHERE b.nart = a.nart)
WHERE nart IN (SELECT nart FROM cmd GROUP BY nart HAVING count(*) > 1)
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2011, 11h51   #3
Invité de passage
 
Inscription : janvier 2010
Messages : 21
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 21
Points : 4
Points : 4
je viens de faire quelque rectification et ca marche nickel un grand grand Merci a toi, bonne journée..
butterflie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 00h47   #4
Invité de passage
 
Inscription : janvier 2010
Messages : 21
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 21
Points : 4
Points : 4
j'en fait un peu trop mais j'ai encore besoin de votre aide ,dans la même requête j'essaie de fusionner les lignes affecté (qui ont un nart commun) en une seule ligne, j'ai beau essayé de modifié la requête que tu m'a donnée mais en vain...une idée??
butterflie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 14h57   #5
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
Peux tu préciser ce que tu souhaites faire exactement, avec en plus un exemple de données avant et après, ce serait parfait.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 23h45   #6
Invité de passage
 
Inscription : janvier 2010
Messages : 21
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 21
Points : 4
Points : 4
Merci de m'avoir répondu..

en premier temps j'ai une table cmd:

select * from cmd;

NCMD NART QTIT
----- ---------- ----------
1 1 25
1 3 20
2 1 20
3 1 40
4 3 10

après exécution de la requête précédente avec un tout petit changement j'ai ca:


NCMD NART QTIT
----- ---------- ----------
1 1 85
2 1 85
3 1 85
4 3 10

alors que moi je veux ce résultat :
NCMD NART QTIT
----- ---------- ----------
1 1 85
2 3 10

Merci de bien m'aider car je suis vraiment a court d'idée..
butterflie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 13h19   #7
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
Et la ligne 1 3 20 ?

C'est pas ceci que tu veux ?
1 1 85
2 3 30

Parce que cette requête est assez facile à faire
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
WITH cmd AS (
SELECT 1 ncmd, 1 nart, 25 qtit FROM DUAL UNION ALL
SELECT 1 ncmd, 3 nart, 20 qtit FROM DUAL UNION ALL
SELECT 2 ncmd, 1 nart, 20 qtit FROM DUAL UNION ALL
SELECT 3 ncmd, 1 nart, 40 qtit FROM DUAL UNION ALL
SELECT 4 ncmd, 3 nart, 10 qtit FROM DUAL)
SELECT ROWNUM ncmd, nart, qtit 
FROM (
      SELECT nart, SUM(qtit) qtit
      FROM cmd
      GROUP BY nart
      )
 
 
NCMD	NART	QTIT
1	1	85
2	3	30
Si le but est de remplacer la table par les nouvelles valeurs, le plus simple est d'insérer le résultat dans une table temporaire, vider la table cmd et la reremplir avec les données de la table temporaire (bien sur il ne faut pas que quelqu'un modifie cmd pendant ce temps).
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2011, 12h17   #8
Invité de passage
 
Inscription : janvier 2010
Messages : 21
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 21
Points : 4
Points : 4
Effectivement c'est ce que j'ai fait, en créons un autre table et en utilisant la dernière partie de ta requête (c'est un peu embêtant d'entrer les valeur a chaque fois). mon problème est résolu maintenant . Merci beaucoup
butterflie 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 20h50.


 
 
 
 
Partenaires

Hébergement Web