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 28/11/2011, 12h19   #1
Invité de passage
 
Homme
Inscription : décembre 2007
Messages : 13
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 13
Points : 3
Points : 3
Par défaut Mettre à jour un champ compteur

Bonjour,

J'ai une table contacts qui contient notamment les informations suivantes
Civilite|Nom|Prenom|Num|CodeClient
M.|Nom1|Prenom1|1|Client1
Mme|Nom2|Prenom2|2|Client2
...

Le champ Num est un compteur pour identification du contact.

Nous sommes en train de refaire notre site Internet et nous allons laissé la possibilité au client de rajouter de nouveaux contacts.
Je me retrouve donc avec des enregistrements avec num=0
Civilite|Nom|Prenom|Num|CodeClient
M.|Nom1|Prenom1|1|Client1
Mme|Nom2|Prenom2|2|Client2
Mme|Nom3|Prenom3|0|Client3
Mme|Nom4|Prenom4|0|Client4


J'aimerai avoir une requete qui me permette de mettre à jour le champ num avec la bonne information et donc d'avoir
M.|Nom1|Prenom1|1|Client1
Mme|Nom2|Prenom2|2|Client2
Mme|Nom3|Prenom3|3|Client3
Mme|Nom4|Prenom4|4|Client4

J'ai vu des choses avec Fetch ou l'utilisation de la fonction WHile mais je bloque pour mettre à jour le champ Num en incrémentant la valeur.

Merci par avance pour votre aide.

Cdlt

Pascal
pas85 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 16h09   #2
Modérateur
 
Avatar de Jinroh77
 
Homme Alexandre Chemla
Consultant en Business Intelligence
Inscription : février 2006
Messages : 1 773
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Chemla
Âge : 28
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : février 2006
Messages : 1 773
Points : 1 837
Points : 1 837
Pourquoi ne aps simplement utiliser une colonne de type IDENTITY ?
__________________
Alexandre Chemla - Consultant MS BI chez Masao
Jinroh77 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/11/2011, 17h20   #3
Invité de passage
 
Homme
Inscription : décembre 2007
Messages : 13
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 13
Points : 3
Points : 3
Je ne peux pas modifier la structure de la table contact car c'est une table lié à l'ERP. Si je change la structure, les mises à jour de l'ERP pourraient ne pas passer.
Je pense que c'est fetch qu'il me faut mais j'ai toujours des soucis pour l'écriture de la requête.
pas85 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 17h35   #4
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 725
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 725
Points : 6 849
Points : 6 849
Pourquoi ne pas utiliser ROW_NUMBER() (si vous êtes au moins en sqlserver 2005) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
declare @contacts TABLE
(
 titre varchar(4),
 nom varchar(50),
 prenom varchar(50),
 num int NULL,
 codeclient varchar(50)
);
 
INSERT @contacts VALUES 
('M.', 'Nom1', 'Prenom1', 1, 'Client1'),
('Mme', 'Nom2', 'Prenom2', 2, 'Client2'),
('Mme', 'Nom3', 'Prenom3', NULL, 'Client3'),
('Mme', 'Nom4', 'Prenom4', NULL, 'Client4')
 
SELECT 
 titre,
 nom,
 prenom,
 ROW_NUMBER() over (ORDER BY codeclient) AS num,
 codeclient
FROM @contacts
++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 17h40   #5
Invité de passage
 
Homme
Inscription : décembre 2007
Messages : 13
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 13
Points : 3
Points : 3
Désolé mais je suis en SQL Server 2000
pas85 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 17h55   #6
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 725
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 725
Points : 6 849
Points : 6 849
Avec 2000 :

Code :
1
2
3
4
5
6
7
8
SELECT 
 titre,
 nom,
 prenom,
 (SELECT COUNT(*) + 1 FROM @contacts AS T2
  WHERE T1.codeclient > T2.codeclient) AS num,
 codeclient
FROM @contacts AS T1
++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 08h20   #7
Invité de passage
 
Homme
Inscription : décembre 2007
Messages : 13
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 13
Points : 3
Points : 3
Merci pour ton aide mikedavem
Ca fonctionne avec l'exemple mais si j'ai plusieurs contacts avec le même codeclient il ne m'incrémente pas le n°.
Et quid de la mise à jour de ces infos dans la table.

Après d'autres recherches j'ai procédé de la facon suivante.
Je ne sais pas si c'est très académique mais ca fonctionne.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
Declare @num float(8)
Declare @prenom varchar(50)
Declare @nom varchar(50)
Declare @codeclient varchar(50)
 
While (SELECT count(*) FROM CONTACTS WHERE Num IS NULL)>0
BEGIN
	SELECT @num=Max(Num)+1 FROM CONTACTS
	SELECT TOP 1 @prenom=Prenom, @nom=Nom, @codeclient=CodeClient  FROM CONTACTS WHERE (Num IS NULL)
	UPDATE CONTACTS SET Num=@num WHERE Prenom=@prenom AND Nom=@nom AND CodeClient=@codeclient
END
Votre avis m'intéresse avant de cloturer.
pas85 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 10h12   #8
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 725
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 725
Points : 6 849
Points : 6 849
Dans ce cas il faut ajouter un prédicat de plus dans la sous requête. Ici je suppose que 2 personnes ne peuvent pas avoir le même nom pour un contact donné mais vous pouvez changer cela en fonction de vos besoins.

Code :
1
2
3
4
5
6
7
8
9
SELECT 
 titre,
 nom,
 prenom,
 (SELECT COUNT(*) FROM @contacts AS T2
  WHERE T1.codeclient >= T2.codeclient
   AND T1.nom >= T2.nom) AS num,
 codeclient
FROM @contacts AS T1
++
mikedavem 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 07h58.


 
 
 
 
Partenaires

Hébergement Web