OVH Cloud OVH Cloud

requete un peu chaude pour moi :)

4 réponses
Avatar
Chris
bonjour,

voila j'ai une table CLIENT avec Id_CLient compose des 3 premières
lettre du nom et un numéro
ex: Mr BONJOUR : BON001, Mr BONLIT : BON002 ...

je cherche a faire un requête SQL qui prend en paramètre le nom du
client et qui me renvoie les 3 première lettre et les 3 chiffres qui
suivront.

par exemple si j'insère Mr BONNECHANCE j'aimerais qu'il me retourne BON003..

je voulais passer par un curseur mais la je bloque.
pourriez vous m'aiguiller

merci

4 réponses

Avatar
Christophe
Plutot bizarre comme technique !

le mieux serait que tu es un compteur dans un champ et un autre champ pour
ton nom

ainsi tu pourrais faire select left(nom,3) + right('000' + cast('15' as
varchar(3)),3) as tonchamp
from tatable etc...


"Chris" a écrit dans le message de
news:
bonjour,

voila j'ai une table CLIENT avec Id_CLient compose des 3 premières
lettre du nom et un numéro
ex: Mr BONJOUR : BON001, Mr BONLIT : BON002 ...

je cherche a faire un requête SQL qui prend en paramètre le nom du
client et qui me renvoie les 3 première lettre et les 3 chiffres qui
suivront.

par exemple si j'insère Mr BONNECHANCE j'aimerais qu'il me retourne


BON003..

je voulais passer par un curseur mais la je bloque.
pourriez vous m'aiguiller

merci


Avatar
tintin
Bonjour,

Je crois que Christophe a bien raison, ce n'est vraiment pas raisonnable de
définir une telle clé.

Avec deux champs au lieu d'un c'est moins pire, mais tu risques de ne pas
pouvoir écrire de contraintes d'intégrité référentielles.

Le mieux est donc un seul IDentifiant numérique, calculé automatiquement par
SQL-Server.

Ce qu'on te demande est à mon avis une survivance due à l'absence de
recherche par nom dans l'application. Si elle existait, un identifiant
numérique simple serait suffisant et ce serait préférable.

Mais si tu ne peux vraiment pas faire autrement, essaie ce qui suit :

create table client ( cle char(3), nom varchar(50) );

create function dbo.NouvelIdClient() returns char(3)
as begin
declare @Id char(3);
select @Id=substring(convert(varchar(4), coalesce(max(substring(Cle, 4,
len(Cle)-3)),0)+1001),2,3) from client ;
return @Id
end

select dbo.NouvelIdClient() -- te donne la première clé disponible

-- tu peux insérer comme cela
insert into client
select substring('Salut',1,3)+dbo.NouvelIdClient(), 'Salut'


Ces instructions sont des exemples qui peuvent être utilisés de différentes
manières.

Attention, ça ne marche que si tu a moins de 1000 clients et il est interdit
de changer le nom d'un client. Pas très chouette comme contraintes...

004BonCourage


"Chris" a écrit :

bonjour,

voila j'ai une table CLIENT avec Id_CLient compose des 3 premières
lettre du nom et un numéro
ex: Mr BONJOUR : BON001, Mr BONLIT : BON002 ...

je cherche a faire un requête SQL qui prend en paramètre le nom du
client et qui me renvoie les 3 première lettre et les 3 chiffres qui
suivront.

par exemple si j'insère Mr BONNECHANCE j'aimerais qu'il me retourne BON003..

je voulais passer par un curseur mais la je bloque.
pourriez vous m'aiguiller

merci



Avatar
Chris
tintin a écrit :
Bonjour,

Je crois que Christophe a bien raison, ce n'est vraiment pas raisonnable de
définir une telle clé.

Avec deux champs au lieu d'un c'est moins pire, mais tu risques de ne pas
pouvoir écrire de contraintes d'intégrité référentielles.

Le mieux est donc un seul IDentifiant numérique, calculé automatiquement par
SQL-Server.

Ce qu'on te demande est à mon avis une survivance due à l'absence de
recherche par nom dans l'application. Si elle existait, un identifiant
numérique simple serait suffisant et ce serait préférable.

Mais si tu ne peux vraiment pas faire autrement, essaie ce qui suit :

create table client ( cle char(3), nom varchar(50) );

create function dbo.NouvelIdClient() returns char(3)
as begin
declare @Id char(3);
select @Id=substring(convert(varchar(4), coalesce(max(substring(Cle, 4,
len(Cle)-3)),0)+1001),2,3) from client ;
return @Id
end

select dbo.NouvelIdClient() -- te donne la première clé disponible

-- tu peux insérer comme cela
insert into client
select substring('Salut',1,3)+dbo.NouvelIdClient(), 'Salut'


Ces instructions sont des exemples qui peuvent être utilisés de différentes
manières.

Attention, ça ne marche que si tu a moins de 1000 clients et il est interdit
de changer le nom d'un client. Pas très chouette comme contraintes...

004BonCourage


"Chris" a écrit :

bonjour,

voila j'ai une table CLIENT avec Id_CLient compose des 3 premières
lettre du nom et un numéro
ex: Mr BONJOUR : BON001, Mr BONLIT : BON002 ...

je cherche a faire un requête SQL qui prend en paramètre le nom du
client et qui me renvoie les 3 première lettre et les 3 chiffres qui
suivront.

par exemple si j'insère Mr BONNECHANCE j'aimerais qu'il me retourne BON003..

je voulais passer par un curseur mais la je bloque.
pourriez vous m'aiguiller

merci





merci je vais tester cela :)
Avatar
SQLpro [MVP]
C'est effectivement particulièrement mauvais comme implémentation et
conduit généralement à des désastres au niveau performances comme au
niveau logiquee (que faire si plus de 1000 clients nommée MAR (MARTIN) ? )

mais voici une telle requête (paramétrée), avec les tables qui vont bien :

CREATE TABLE T_CLIENT_CLI
(CLI_NOM VARCHAR(16),
CLI_REF CHAR(6))

INSERT INTO T_CLIENT_CLI VALUES ('MARTIN', 'MAR001')
INSERT INTO T_CLIENT_CLI VALUES ('MARTIN', 'MAR002')
INSERT INTO T_CLIENT_CLI VALUES ('DUPONT', 'DUP001')

-- exemple avec BUGEAUD..

DECLARE @NOM VARCHAR(16)

SET @NOM = 'BUGEAUD'

SELECT CLI_REF +
CASE
WHEN LEN(CLI_NUM) = 1 THEN '00' + CLI_NUM
WHEN LEN(CLI_NUM) = 2 THEN '0' + CLI_NUM
ELSE CLI_NUM
END
FROM
(
SELECT SUBSTRING(@NOM, 1, 3) AS CLI_REF,
CAST(MAX(CAST(SUBSTRING(CLI_REF, 4, 3) AS INTEGER)) + 1 AS VARCHAR(3))
AS CLI_NUM
FROM T_CLIENT_CLI
WHERE SUBSTRING(CLI_REF, 1, 3) = SUBSTRING(@NOM, 1, 3)
GROUP BY SUBSTRING(CLI_REF, 1, 3)
UNION
SELECT DISTINCT SUBSTRING(@NOM, 1, 3), '1'
FROM INFORMATION_SCHEMA.TABLES
WHERE NOT EXISTS (SELECT * FROM T_CLIENT_CLI WHERE SUBSTRING(CLI_REF,
1, 3) = SUBSTRING(@NOM, 1, 3))
AND TABLE_NAME = 'T_CLIENT_CLI'
AND TABLE_SCHEMA = 'dbo'
) T



Essayez ensuite avec MARTINOT par exemple.


Bon amusement !

A +



Chris a écrit :
bonjour,

voila j'ai une table CLIENT avec Id_CLient compose des 3 premières
lettre du nom et un numéro
ex: Mr BONJOUR : BON001, Mr BONLIT : BON002 ...

je cherche a faire un requête SQL qui prend en paramètre le nom du
client et qui me renvoie les 3 première lettre et les 3 chiffres qui
suivront.

par exemple si j'insère Mr BONNECHANCE j'aimerais qu'il me retourne
BON003..

je voulais passer par un curseur mais la je bloque.
pourriez vous m'aiguiller

merci




--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************