Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
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/12/2010, 12h34   #1
Candidat au titre de Membre du Club
 
Inscription : février 2005
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 114
Points : 13
Points : 13
Par défaut Récupérer la somme de deux colonnes

* Bonjour, *

j'ai deux colonnes dans ma table. Une "montant" et l'autre "modification". Je cherche à calculer le nouveau montant en fonction de la modification. Comment pourrais je faire ca ?

* Merci *
Hydre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2010, 13h28   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 968
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 968
Points : 18 200
Points : 18 200
Envoyer un message via MSN à CinePhil
Tu ne donnes pas assez d'infos pour qu'on puisse t'aider efficacement.
http://www.developpez.net/forums/a69...gage-sql-lire/
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2010, 22h54   #3
Membre Expert
 
Avatar de Nudger
 
Homme Thomas Arnaud
Directeur de projet
Inscription : octobre 2010
Messages : 452
Détails du profil
Informations personnelles :
Nom : Homme Thomas Arnaud
Âge : 36
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Directeur de projet
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : octobre 2010
Messages : 452
Points : 1 012
Points : 1 012
Envoyer un message via Skype™ à Nudger
Bonsoir,

Ca pourrait ressembler à ça:

Code :
1
2
UPDATE une_table
SET montant = montant + modification, modification = 0
__________________
www.nudge.org Surveillez et optimisez vos applications Java
Nudger est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 10h13   #4
Candidat au titre de Membre du Club
 
Inscription : février 2005
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 114
Points : 13
Points : 13
Bonjour, voila ma table :

Code :
1
2
3
4
idRecord  |  OldNumber  | NewNumber  |  Date
1               -4               4         11.01.2010 00:00:00 
2               -9              18        31.08.2010 00:00:00
3                0               -1        04.09.2010 12:15:58
Le but c'est de partir depuis le 1er NewNumber donc 4 et l'additionner avec le suivant (18) et d'insérer le résultat (22) dans oldNumber puis additionner le NewNumber etc...

Merci de l'aide, ca à l'air assez complexe...
Hydre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 10h18   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 968
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 968
Points : 18 200
Points : 18 200
Envoyer un message via MSN à CinePhil
Et ton 22 doit aller où ? Sur la ligne 3 ?
Tu ne serais pas en train de vouloir utiliser un SGBD comme un tableur toi ?
Que représentent ces OldNumber et NewNumber ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 10h18   #6
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 637
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 637
Points : 2 629
Points : 2 629
qu'est-ce qui détermine votre "suivant" ?

Quand vous dites insérer le resultat dans oldNumber c'est quelle ligne ?

Ensuite vous dites "puis additionner le NewNumber", on l'additionne avec quoi ?


Vous ne pouvez pas développer votre schéma avec les résultats des étapes pour qu'on comprenne l'algo utilisé ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 10h26   #7
Candidat au titre de Membre du Club
 
Inscription : février 2005
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 114
Points : 13
Points : 13
le but se serait de remplacer le 0 de la ligne 3 avec 22 et aditioner 22 à -1 et dans la ligne 4 on aurait 21 en oldNumber
Hydre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 10h36   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 968
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 968
Points : 18 200
Points : 18 200
Envoyer un message via MSN à CinePhil
Je souscris à ce que dit Punkoff.
Donne nous la nature du besoin et le processus qui te conduisent à cette structure de données.
J'ai notamment du mal à comprendre d'où viennent les deux premiers OldNumber si le troisième doit être l'addition des deux premiers NewNumber et que, si j'ai bien compris, le OldNumber de la ligne 5 sera l'addition du OldNumber et du NewNumber de la ligne 4.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 10h46   #9
Candidat au titre de Membre du Club
 
Inscription : février 2005
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 114
Points : 13
Points : 13
En fait on a du enlever des row et les "oldNumber" sont donc faux. Pour etre concret se sont des quantités de stock avec variations.
On m'a dit qu'un curseur pour faire l'affaire mais n'ayant jamais employé ca je ne vois pas bien...
Hydre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 11h06   #10
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 968
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 968
Points : 18 200
Points : 18 200
Envoyer un message via MSN à CinePhil
N'ayant moi non plus jamais utilisé de curseur, je ne vais pas pouvoir t'aider sur ce sujet.
Je vos par contre chez SQLPro un article qui dit de les éviter. Mais peut-être pourrais-tu aussi regarder du côté des requêtes récursives.

Ça dépend bien sûr de ce que ton SGBD est capable de faire. MySQL ne connaît pas les requêtes récursives.

Ta demande concerne t-elle la mise à jour de la table ou l'insertion de nouvelles données ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 11h29   #11
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 637
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 637
Points : 2 629
Points : 2 629
Perso j'ai toujours pas compris l'algo.


Là c'est bien joli, mais je suppose que tu as des centaines de lignes a updater, et on ne sais toujours pas comment on sélectionne les données de départ (quels criteres ??) et pour updater quelle donnée (quels criteres ??), et non plus comment on continu nos sélection.


Un curseur te permettra de traiter d'une manière séquentielle ton problème.
La requete sql va te faire un traitement global.

On a plein de prog qui tourne avec des curseur (en cobol) et aucun problème avec.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 11h56   #12
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
bonjour

c'est vrai qu'il est difficile de comprendre précisément ton besoin, mais a première vue je pense que tu pourra te passer d'un trigger.

Avec un trigger, tu traitera ligne par ligne, alors que les SGBD sont optimisés pour travailler sur des ensembles.

explique nous plus précisément la logique, et on pourra te proposer des solutions
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 12h29   #13
Candidat au titre de Membre du Club
 
Inscription : février 2005
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 114
Points : 13
Points : 13
En fait il faut toujours commencer depuis la 1ère ligne et depuis la colonne NewNumber puisque je remplis précédemment cette table avec les lignes désirées. Dans un 1er temps il ne faut pas prendre en compte la colonne old puisque ces chiffres sont faux.
Je vais reprendre un exemple en ne montrant que les colonnes chiffres. Admettons que dans ma table j'ai ca :

Code :
1
2
3
4
old   |  new
-7        4
-8        6
10       -4
Le but se serait de transformer ca en

Code :
1
2
3
4
old   |  new
-7        4
4        10
10       6
Ca veut dire qu'il faut faire 4 + 6 de la colonne new et update le 6 en 10. Puis comme il y a -4 il faut faire 10 - 4 et update le -4 en 6 qui sera le new de la ligne 3.
Hydre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 13h00   #14
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 637
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 637
Points : 2 629
Points : 2 629
comment détermine-t-on la 1ere "ligne" ? et comment détermine-t-on la ligne a updater ?

la notion de 1ere ligne, 2eme ligne n'a pas de sens dans un sgbd, car une "ligne" physique peut être placée en plein milieu d'une table alors que selon certain critere ce sera la "1ere ligne".

donc si dans votre table vous avez par exemple ces enregistrements :
Citation:
id |nom
1 "paul"
2 "farid"
3 "piotrec"
Une simple sélection, sans aucun critère pourra vous retourner ceci :
Code :
1
2
 
SELECT * FROM ma_table
Citation:
2, farid
1, paul
3, piotrec
Donc dans ce select si je prend la 1ere ligne ca sera le couple (2, Farid).

Maintenant si la table physique est organiser différemment la 1ere ligne pourra être le couple (3, piotrec) !!

Il en va de même pour la notion de 2eme ligne.


Sinon j'ai compris le process d'update avec vos dernières explication


edit:
Citation:
En fait il faut toujours commencer depuis la 1ère ligne et depuis la colonne NewNumber puisque je remplis précédemment cette table avec les lignes désirées.
Si je pose l'hypothèse que vos critère pour désigner la 1ere ligne puis la 2eme lignes sont les id dans l'ordre croissant, je n'aurai pas de solution one shot.

En effet il faudra d'abord construire votre résultat via une requête récursive (CTE) je penses, et faire un update à partir de là.

A moins que votre SGBD gère les CTE sur un update.

Donc ne pouvons pas faire en un coup tout ce système ?
il faudrait que l'on puisse partir des données de base afin de créer une structure temporaire final, et ceci sans passer par votre table temporaire qui ne travaille que sur peu de donnée.

sinon voici un exemple de requête récursive pour votre select :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
WITH tmp_rec(id, old, new) AS 
(SELECT id, old, new 
FROM test
WHERE id = 1
union ALL
SELECT b.id, a.new, a.new + b.new
FROM tmp_rec a
INNER JOIN test b ON b.id = a.id + 1)
 
SELECT * FROM tmp_rec;
Si je part de votre exemple, ca me retourne le résutlat voulu.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 14h03   #15
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 463
Points : 10 463
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Quel est votre SGBD ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 14h13   #16
Candidat au titre de Membre du Club
 
Inscription : février 2005
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 114
Points : 13
Points : 13
hello, alors j'utilise MS SQLSERVER. Merci pour votre solution mais j'ai une erreur avec le "WITH". Est-ce que c'est compatible avec mon sgbd ?
Hydre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 14h32   #17
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
les CTE (WITH) sont compatibles depuis SQL Server 2005

quelle est votre version ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 14h39   #18
Candidat au titre de Membre du Club
 
Inscription : février 2005
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 114
Points : 13
Points : 13
je sais pas exactement ce qui est sur le serveur mais ca doit etre un problème de syntaxe plutot que de compatibilité en fait.

Mais pour en revenir à sa solution, quand je vois cette ligne

Code :
INNER JOIN test b ON b.id = a.id + 1)
Si les id ne se suivent pas régulièrement ca ne marche donc pas. Il faut que je puisse lui dire de prendre la ligne suivante
Hydre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 14h41   #19
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
s'il y a des "trous" dans les indices, utilisez row_number() over(order by id), et servez vous de cela pour votre jointure
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 14h44   #20
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 637
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 637
Points : 2 629
Points : 2 629
Citation:
Envoyé par Hydre Voir le message
je sais pas exactement ce qui est sur le serveur mais ca doit etre un problème de syntaxe plutot que de compatibilité en fait.

Mais pour en revenir à sa solution, quand je vois cette ligne

Code :
INNER JOIN test b ON b.id = a.id + 1)
Si les id ne se suivent pas régulièrement ca ne marche donc pas. Il faut que je puisse lui dire de prendre la ligne suivante
D'où mes questions 2 poste plus haut, tant que vous ne définirez pas exactement vos critère de sélection de "1ere ligne", et de "ligne à updater" vous n'arriverez à rien de bien.
punkoff 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 17h00.


 
 
 
 
Partenaires

Hébergement Web