Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Recherche de la commande SQL

8 réponses
Avatar
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é

8 réponses

Avatar
JIELPE53
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é




Avatar
Fred BROUARD
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 ***********************
Avatar
Philippe TROTIN [MS]
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
_______________________________
<Andre.L' a écrit dans le message de
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é



Avatar
Andre.L'HOIR
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é







Avatar
Fr
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




<Andre.L' wrote in message
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é



Avatar
Philippe TROTIN [MS]
Bonjour,

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

Cordialement
_______________________________

Philippe TROTIN
Microsoft Services France
_______________________________
"" a écrit dans le message de
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




<Andre.L' wrote in message
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é





Avatar
Fred BROUARD
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




<Andre.L' wrote in message
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 ***********************
Avatar
Philippe TROTIN [MS]
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" a écrit dans le message de
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




<Andre.L' wrote in message
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 ***********************