Recherche de la commande SQL

Le
Andre.L'HOIR
Bonjour à tous,

Je suis un peu perdu. J'essaie de concaténer deux même champs de deux
enregistrements différents mais pour un même produit

J'ai une chaine SQL qui me donne comme résultat suivant:

produit A, "chaine 1"
produit A, "chaine 2"
produit B, "chaine 1"
produit C, "chaine 1"
produit C, "chaine 2"
produit C, "chaine 3"

Le Résultat que j'essaie d'obtenir:

produit A, "chaine 1 / chaine 2"
produit B, "chaine 1"
produit C, "chaine 1 / chaine 2 / chaine 3"

Comment écrire cette chaine SQL???
Merci d'avance
André
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
JIELPE53
Le #11838621
En SQL, je ne connais pas de fonction d'agregat (de type somme) pour les
chaines de caractères...
Pour du numérique, ce serait très simple :

SELECT PRODUIT, SUM(CHAINE) FROM MATABLE
GROUP BY PRODUIT

Mais l'équivalent pour un champ du style VARCHAR qui serait une fonction de
concaténation n'existe pas.

Par contre SQL Server 2005 propose des instructions type PIVOT qui doivent
pouvoir effectuer ces requête (analyse croisée...).

"Andre.L'" a écrit :

Bonjour à tous,

Je suis un peu perdu. J'essaie de concaténer deux même champs de deux
enregistrements différents mais pour un même produit

J'ai une chaine SQL qui me donne comme résultat suivant:

produit A, "chaine 1"
produit A, "chaine 2"
produit B, "chaine 1"
produit C, "chaine 1"
produit C, "chaine 2"
produit C, "chaine 3"

Le Résultat que j'essaie d'obtenir:

produit A, "chaine 1 / chaine 2"
produit B, "chaine 1"
produit C, "chaine 1 / chaine 2 / chaine 3"

Comment écrire cette chaine SQL???
Merci d'avance
André




Fred BROUARD
Le #11838601
Andre.L' a écrit :
Bonjour à tous,

Je suis un peu perdu. J'essaie de concaténer deux même champs de deux
enregistrements différents mais pour un même produit

J'ai une chaine SQL qui me donne comme résultat suivant:

produit A, "chaine 1"
produit A, "chaine 2"
produit B, "chaine 1"
produit C, "chaine 1"
produit C, "chaine 2"
produit C, "chaine 3"

Le Résultat que j'essaie d'obtenir:

produit A, "chaine 1 / chaine 2"
produit B, "chaine 1"
produit C, "chaine 1 / chaine 2 / chaine 3"




Ce que vous voulez faire, c'est de la cosmétique. SQL n'est pas fait
pour cela et le coût d'un tel traitement en SQL sera exhorbitant.

Faîte cela en code client.

A +


Comment écrire cette chaine SQL???
Merci d'avance
André





--
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 ***********************
Philippe TROTIN [MS]
Le #11838591
Il n'y a rien de natif mais on peut toujours faire cela si le volume de
données n'est pas trop important :

<<

SET NOCOUNT ON

DECLARE @MyTable TABLE(Produit nvarchar(100), Chaine nvarchar(max))

INSERT INTO @MyTable(Produit, Chaine) VALUES('produit A', 'chaine 1')
INSERT INTO @MyTable(Produit, Chaine) VALUES('produit A', 'chaine 2')
INSERT INTO @MyTable(Produit, Chaine) VALUES('produit B', 'chaine 1')
INSERT INTO @MyTable(Produit, Chaine) VALUES('produit C', 'chaine 1')
INSERT INTO @MyTable(Produit, Chaine) VALUES('produit C', 'chaine 2')
INSERT INTO @MyTable(Produit, Chaine) VALUES('produit C', 'chaine 3')

DECLARE @MyString nvarchar(1000)
DECLARE @Cur_Produit nvarchar(100)
DECLARE @MyResultTable TABLE(Produit nvarchar(100), Chaine nvarchar(max))

-- Produits différents
INSERT INTO @MyResultTable(Produit, Chaine)
SELECT DISTINCT Produit, ''
FROM @MyTable

DECLARE MyCursor CURSOR FAST_FORWARD FOR
SELECT Produit
FROM @MyResultTable

OPEN MyCursor
FETCH NEXT FROM MyCursor INTO @Cur_Produit
WHILE @@FETCH_STATUS = 0
BEGIN
SET @MyString = ''

SELECT @MyString = @MyString + Chaine + ' / ' FROM @MyTable WHERE Produit =
@Cur_Produit

UPDATE @MyResultTable SET Chaine = @MyString WHERE Produit = @Cur_Produit

FETCH NEXT FROM MyCursor INTO @Cur_Produit
END
CLOSE MyCursor
DEALLOCATE MyCursor

SELECT * FROM @MyResultTable









Cordialement
_______________________________

Philippe TROTIN
Microsoft Services France
_______________________________
news:
Bonjour à tous,

Je suis un peu perdu. J'essaie de concaténer deux même champs de deux
enregistrements différents mais pour un même produit

J'ai une chaine SQL qui me donne comme résultat suivant:

produit A, "chaine 1"
produit A, "chaine 2"
produit B, "chaine 1"
produit C, "chaine 1"
produit C, "chaine 2"
produit C, "chaine 3"

Le Résultat que j'essaie d'obtenir:

produit A, "chaine 1 / chaine 2"
produit B, "chaine 1"
produit C, "chaine 1 / chaine 2 / chaine 3"

Comment écrire cette chaine SQL???
Merci d'avance
André



Andre.L'HOIR
Le #11838551
Bonjour.

J'aimerais vous remercier à tous les deux pour votre support. Effectivement,
vous avez raison.

Vu que je suis occupé a créer un site Internet en ColdFusion, je vais faire la
concaténation au moment de l'affichage du résultat. Vu qu'il n'y a que 2800
enregistrements dans la base de donnée. c'est pas grand chose.

Je me complique la vie pour rien.

Merci

André





Je suis un peu perdu. J'essaie de concaténer deux même champs de deux
enregistrements différents mais pour un même produit

J'ai une chaine SQL qui me donne comme résultat suivant:

produit A, "chaine 1"
produit A, "chaine 2"
produit B, "chaine 1"
produit C, "chaine 1"
produit C, "chaine 2"
produit C, "chaine 3"

Le Résultat que j'essaie d'obtenir:

produit A, "chaine 1 / chaine 2"
produit B, "chaine 1"
produit C, "chaine 1 / chaine 2 / chaine 3"




Ce que vous voulez faire, c'est de la cosmétique. SQL n'est pas fait
pour cela et le coût d'un tel traitement en SQL sera exhorbitant.

Faîte cela en code client.

A +


Comment écrire cette chaine SQL???
Merci d'avance
André







Fr
Le #11838541
Bonjour,

Effectivement Fred à raison sur le principe ce n'est pas le boulot de
SQLServer, ni d'aucun autre SGBDR .... mais pour de petit volume
j'utiliserai une UDF plutôt que des curseurs qui sont assez contre
performant dans SQLServer... à mon avis la solution ci dessous est la moins
pire ;-)

CREATE FUNCTION f_get_chaine_by_prod(@prod VARCHAR(50))
RETURNS VARCHAR(max)
BEGIN
DECLARE @r VARCHAR(max)
SET @r=''
SELECT @r=@r+chaine+' / '
FROM produit
WHERE [PRODUIT]=@prod
SET @r=LEFT(@r,LEN(@r)-2) -- supprime le dernier ' / '
RETURN ISNULL(@r,'')
END

SELECT PRODUIT,dbo.f_get_chaine_by_prod(PRODUIT)
FROM [PRODUIT]
GROUP BY [PRODUIT]

Bon courage




news:
Bonjour à tous,

Je suis un peu perdu. J'essaie de concaténer deux même champs de deux
enregistrements différents mais pour un même produit

J'ai une chaine SQL qui me donne comme résultat suivant:

produit A, "chaine 1"
produit A, "chaine 2"
produit B, "chaine 1"
produit C, "chaine 1"
produit C, "chaine 2"
produit C, "chaine 3"

Le Résultat que j'essaie d'obtenir:

produit A, "chaine 1 / chaine 2"
produit B, "chaine 1"
produit C, "chaine 1 / chaine 2 / chaine 3"

Comment écrire cette chaine SQL???
Merci d'avance
André



Philippe TROTIN [MS]
Le #11838471
Bonjour,

Effectivement c'est bien plus élégant que ma solution :-)

Cordialement
_______________________________

Philippe TROTIN
Microsoft Services France
_______________________________
"" news:%
Bonjour,

Effectivement Fred à raison sur le principe ce n'est pas le boulot de
SQLServer, ni d'aucun autre SGBDR .... mais pour de petit volume
j'utiliserai une UDF plutôt que des curseurs qui sont assez contre
performant dans SQLServer... à mon avis la solution ci dessous est la
moins pire ;-)

CREATE FUNCTION f_get_chaine_by_prod(@prod VARCHAR(50))
RETURNS VARCHAR(max)
BEGIN
DECLARE @r VARCHAR(max)
SET @r=''
SELECT @r=@r+chaine+' / '
FROM produit
WHERE [PRODUIT]=@prod
SET @r=LEFT(@r,LEN(@r)-2) -- supprime le dernier ' / '
RETURN ISNULL(@r,'')
END

SELECT PRODUIT,dbo.f_get_chaine_by_prod(PRODUIT)
FROM [PRODUIT]
GROUP BY [PRODUIT]

Bon courage




news:
Bonjour à tous,

Je suis un peu perdu. J'essaie de concaténer deux même champs de deux
enregistrements différents mais pour un même produit

J'ai une chaine SQL qui me donne comme résultat suivant:

produit A, "chaine 1"
produit A, "chaine 2"
produit B, "chaine 1"
produit C, "chaine 1"
produit C, "chaine 2"
produit C, "chaine 3"

Le Résultat que j'essaie d'obtenir:

produit A, "chaine 1 / chaine 2"
produit B, "chaine 1"
produit C, "chaine 1 / chaine 2 / chaine 3"

Comment écrire cette chaine SQL???
Merci d'avance
André





Fred BROUARD
Le #11838441
et on peut faire encore mieux en utilisant une CTE...

A +

a écrit :
Bonjour,

Effectivement Fred à raison sur le principe ce n'est pas le boulot de
SQLServer, ni d'aucun autre SGBDR .... mais pour de petit volume
j'utiliserai une UDF plutôt que des curseurs qui sont assez contre
performant dans SQLServer... à mon avis la solution ci dessous est la
moins pire ;-)

CREATE FUNCTION f_get_chaine_by_prod(@prod VARCHAR(50))
RETURNS VARCHAR(max)
BEGIN
DECLARE @r VARCHAR(max)
SET @r=''
SELECT @r=@r+chaine+' / '
FROM produit
WHERE [PRODUIT]=@prod
SET @r=LEFT(@r,LEN(@r)-2) -- supprime le dernier ' / '
RETURN ISNULL(@r,'')
END

SELECT PRODUIT,dbo.f_get_chaine_by_prod(PRODUIT)
FROM [PRODUIT]
GROUP BY [PRODUIT]

Bon courage




news:
Bonjour à tous,

Je suis un peu perdu. J'essaie de concaténer deux même champs de deux
enregistrements différents mais pour un même produit

J'ai une chaine SQL qui me donne comme résultat suivant:

produit A, "chaine 1"
produit A, "chaine 2"
produit B, "chaine 1"
produit C, "chaine 1"
produit C, "chaine 2"
produit C, "chaine 3"

Le Résultat que j'essaie d'obtenir:

produit A, "chaine 1 / chaine 2"
produit B, "chaine 1"
produit C, "chaine 1 / chaine 2 / chaine 3"

Comment écrire cette chaine SQL???
Merci d'avance
André







--
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 ***********************
Philippe TROTIN [MS]
Le #11838361
Bonjour Fred,

J'avais bien essayé cela dans un premier temps, c'est tout de suite ce qui
m'est venu à l'esprit mais le bout de code que j'avais écrit ne fonctionnait
pas avec ma CTE et je n'avais pas trop le temps de chercher :-(

Cordialement
_______________________________

Philippe TROTIN
Microsoft Services France
_______________________________
"Fred BROUARD" news:utU$
et on peut faire encore mieux en utilisant une CTE...

A +

a écrit :
Bonjour,

Effectivement Fred à raison sur le principe ce n'est pas le boulot de
SQLServer, ni d'aucun autre SGBDR .... mais pour de petit volume
j'utiliserai une UDF plutôt que des curseurs qui sont assez contre
performant dans SQLServer... à mon avis la solution ci dessous est la
moins pire ;-)

CREATE FUNCTION f_get_chaine_by_prod(@prod VARCHAR(50))
RETURNS VARCHAR(max)
BEGIN
DECLARE @r VARCHAR(max)
SET @r=''
SELECT @r=@r+chaine+' / '
FROM produit
WHERE [PRODUIT]=@prod
SET @r=LEFT(@r,LEN(@r)-2) -- supprime le dernier ' / '
RETURN ISNULL(@r,'')
END

SELECT PRODUIT,dbo.f_get_chaine_by_prod(PRODUIT)
FROM [PRODUIT]
GROUP BY [PRODUIT]

Bon courage




news:
Bonjour à tous,

Je suis un peu perdu. J'essaie de concaténer deux même champs de deux
enregistrements différents mais pour un même produit

J'ai une chaine SQL qui me donne comme résultat suivant:

produit A, "chaine 1"
produit A, "chaine 2"
produit B, "chaine 1"
produit C, "chaine 1"
produit C, "chaine 2"
produit C, "chaine 3"

Le Résultat que j'essaie d'obtenir:

produit A, "chaine 1 / chaine 2"
produit B, "chaine 1"
produit C, "chaine 1 / chaine 2 / chaine 3"

Comment écrire cette chaine SQL???
Merci d'avance
André







--
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 ***********************


Publicité
Poster une réponse
Anonyme