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

Requête concaténation sur plusieurs champs

4 réponses
Avatar
404 found
bonjour,
voici le schéma de ma table

id num ch1 ch2 ch3
----------------------------------------------
1 1 A a
2 1 B b
3 1 C c
4 2 D d

le but est de mettre dans ch3 la concaténation de ch1 et ch2 groupé par num
(c'est trés important) donc le but est d'avoir dans ma table à la fin :
id num ch1 ch2 ch3
----------------------------------------------
1 1 A a AaBbCc
2 1 B b AaBbCc
3 1 C c AaBbCc
4 2 D d Dd

Des idées ?

Merci.

4 réponses

Avatar
Fred BROUARD
bonjour

404 found a écrit:
bonjour,
voici le schéma de ma table

id num ch1 ch2 ch3
----------------------------------------------
1 1 A a
2 1 B b
3 1 C c
4 2 D d

le but est de mettre dans ch3 la concaténation de ch1 et ch2 groupé par num
(c'est trés important) donc le but est d'avoir dans ma table à la fin :
id num ch1 ch2 ch3
----------------------------------------------
1 1 A a AaBbCc
2 1 B b AaBbCc
3 1 C c AaBbCc
4 2 D d Dd

Des idées ?



C'est possible en une seule requête...

démonstration :

CREATE TABLE ALACON
(id INT,
num INT,
ch1 CHAR(1),
ch2 CHAR(1))

INSERT INTO ALACON VALUES (1, 1, 'A', 'a')
INSERT INTO ALACON VALUES (2, 1, 'B', 'b')
INSERT INTO ALACON VALUES (3, 1, 'C', 'c')
INSERT INTO ALACON VALUES (4, 2, 'D', 'd')

Vous auriez pu avoir l'aimabilité de m'éviter de créer ces tables en proposant
par vous même de poster ce code. Simple politesse. D'autant qu'avec SQL server
en 3 clics, c'est possible !

Solution en utilisant les expressions de table, dans ce cas sous forme récursive :

WITH T_CONCAT
AS
(SELECT id, num, ch1, ch2, CAST(ch1 + ch2 AS VARCHAR(max)) AS ch3
FROM ALACON
UNION ALL
SELECT ALC.id, ALC.num, ALC.ch1, ALC.ch2, CTE.ch3 + ALC.ch1 + ALC.ch2
FROM ALACON ALC
INNER JOIN T_CONCAT AS CTE
ON ALC.id = CTE.id + 1 AND ALC.num = CTE.num)
SELECT A.*, ch3
FROM T_CONCAT C
INNER JOIN ALACON A
ON C.num = A.num
WHERE LEN(ch3) = (SELECT MAX(LEN(ch3)) FROM T_CONCAT WHERE num = C.num)
ORDER BY id, num

Le résultat :

id num ch1 ch2 ch3
----------- ----------- ---- ---- -----------------------
1 1 A a AaBbCc
2 1 B b AaBbCc
3 1 C c AaBbCc
4 2 D d Dd

(4 row(s) affected)

bien entendu cela n'est possible que si vous êtes sous SQL Server 2005. Étant
entendu que vous n'avez pas précisez votre version de MS SQL Server !


Merci.



A +

--
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
404 found
M. BROUARD, tous mes respects !

A chaque fois que je lis un de vos postes, j'apprend quelques choses !!
désolé s'il manque du code ou des précisions, ce sont des reflexes que je
n'ai pas encore !

Je suis sous SQL Server 2000.

Je vais essayer de m'ensortir avec le code proposé !

Merci encore !

"Fred BROUARD" a écrit :

bonjour

404 found a écrit:
> bonjour,
> voici le schéma de ma table
>
> id num ch1 ch2 ch3
> ----------------------------------------------
> 1 1 A a
> 2 1 B b
> 3 1 C c
> 4 2 D d
>
> le but est de mettre dans ch3 la concaténation de ch1 et ch2 groupé par num
> (c'est trés important) donc le but est d'avoir dans ma table à la fin :
> id num ch1 ch2 ch3
> ----------------------------------------------
> 1 1 A a AaBbCc
> 2 1 B b AaBbCc
> 3 1 C c AaBbCc
> 4 2 D d Dd
>
> Des idées ?

C'est possible en une seule requête...

démonstration :

CREATE TABLE ALACON
(id INT,
num INT,
ch1 CHAR(1),
ch2 CHAR(1))

INSERT INTO ALACON VALUES (1, 1, 'A', 'a')
INSERT INTO ALACON VALUES (2, 1, 'B', 'b')
INSERT INTO ALACON VALUES (3, 1, 'C', 'c')
INSERT INTO ALACON VALUES (4, 2, 'D', 'd')

Vous auriez pu avoir l'aimabilité de m'éviter de créer ces tables en proposant
par vous même de poster ce code. Simple politesse. D'autant qu'avec SQL server
en 3 clics, c'est possible !

Solution en utilisant les expressions de table, dans ce cas sous forme récursive :

WITH T_CONCAT
AS
(SELECT id, num, ch1, ch2, CAST(ch1 + ch2 AS VARCHAR(max)) AS ch3
FROM ALACON
UNION ALL
SELECT ALC.id, ALC.num, ALC.ch1, ALC.ch2, CTE.ch3 + ALC.ch1 + ALC.ch2
FROM ALACON ALC
INNER JOIN T_CONCAT AS CTE
ON ALC.id = CTE.id + 1 AND ALC.num = CTE.num)
SELECT A.*, ch3
FROM T_CONCAT C
INNER JOIN ALACON A
ON C.num = A.num
WHERE LEN(ch3) = (SELECT MAX(LEN(ch3)) FROM T_CONCAT WHERE num = C.num)
ORDER BY id, num

Le résultat :

id num ch1 ch2 ch3
----------- ----------- ---- ---- -----------------------
1 1 A a AaBbCc
2 1 B b AaBbCc
3 1 C c AaBbCc
4 2 D d Dd

(4 row(s) affected)

bien entendu cela n'est possible que si vous êtes sous SQL Server 2005. Étant
entendu que vous n'avez pas précisez votre version de MS SQL Server !

>
> Merci.

A +

--
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
Fred BROUARD
404 found a écrit:
M. BROUARD, tous mes respects !

A chaque fois que je lis un de vos postes, j'apprend quelques choses !!
désolé s'il manque du code ou des précisions, ce sont des reflexes que je
n'ai pas encore !

Je suis sous SQL Server 2000.

Je vais essayer de m'ensortir avec le code proposé !



Hélas cela ne marchera pas. Les CTE n'existent que depuis la version 2005.

Voici une solution avec une UDF pour SQL Server 2000 :

CREATE FUNCTION F_CONCAT_CH1CH2 (@num INT)
RETURNS VARCHAR(8000)
AS
BEGIN

DECLARE @Ch3 VARCHAR(8000)

SET @Ch3 = ''

SELECT @Ch3 = ch1 + ch2 +@Ch3
FROM ALACON
WHERE num = @num

RETURN @Ch3

END
GO

SELECT id, num, ch1, ch2, dbo.F_CONCAT_CH1CH2 (num) AS ch3
FROM ALACON

A +




Merci encore !

"Fred BROUARD" a écrit :


bonjour

404 found a écrit:

bonjour,
voici le schéma de ma table

id num ch1 ch2 ch3
----------------------------------------------
1 1 A a
2 1 B b
3 1 C c
4 2 D d

le but est de mettre dans ch3 la concaténation de ch1 et ch2 groupé par num
(c'est trés important) donc le but est d'avoir dans ma table à la fin :
id num ch1 ch2 ch3
----------------------------------------------
1 1 A a AaBbCc
2 1 B b AaBbCc
3 1 C c AaBbCc
4 2 D d Dd

Des idées ?



C'est possible en une seule requête...

démonstration :

CREATE TABLE ALACON
(id INT,
num INT,
ch1 CHAR(1),
ch2 CHAR(1))

INSERT INTO ALACON VALUES (1, 1, 'A', 'a')
INSERT INTO ALACON VALUES (2, 1, 'B', 'b')
INSERT INTO ALACON VALUES (3, 1, 'C', 'c')
INSERT INTO ALACON VALUES (4, 2, 'D', 'd')

Vous auriez pu avoir l'aimabilité de m'éviter de créer ces tables en proposant
par vous même de poster ce code. Simple politesse. D'autant qu'avec SQL server
en 3 clics, c'est possible !

Solution en utilisant les expressions de table, dans ce cas sous forme récursive :

WITH T_CONCAT
AS
(SELECT id, num, ch1, ch2, CAST(ch1 + ch2 AS VARCHAR(max)) AS ch3
FROM ALACON
UNION ALL
SELECT ALC.id, ALC.num, ALC.ch1, ALC.ch2, CTE.ch3 + ALC.ch1 + ALC.ch2
FROM ALACON ALC
INNER JOIN T_CONCAT AS CTE
ON ALC.id = CTE.id + 1 AND ALC.num = CTE.num)
SELECT A.*, ch3
FROM T_CONCAT C
INNER JOIN ALACON A
ON C.num = A.num
WHERE LEN(ch3) = (SELECT MAX(LEN(ch3)) FROM T_CONCAT WHERE num = C.num)
ORDER BY id, num

Le résultat :

id num ch1 ch2 ch3
----------- ----------- ---- ---- -----------------------
1 1 A a AaBbCc
2 1 B b AaBbCc
3 1 C c AaBbCc
4 2 D d Dd

(4 row(s) affected)

bien entendu cela n'est possible que si vous êtes sous SQL Server 2005. Étant
entendu que vous n'avez pas précisez votre version de MS SQL Server !


Merci.



A +

--
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" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.datasapiens.com ***********************







--
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" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.datasapiens.com ***********************
Avatar
404 found
Merci, c'est impécable !

je ferais plus attention les prochaines posts !!

Bonne journée.

"Fred BROUARD" a écrit :



404 found a écrit:
> M. BROUARD, tous mes respects !
>
> A chaque fois que je lis un de vos postes, j'apprend quelques choses !!
> désolé s'il manque du code ou des précisions, ce sont des reflexes que je
> n'ai pas encore !
>
> Je suis sous SQL Server 2000.
>
> Je vais essayer de m'ensortir avec le code proposé !

Hélas cela ne marchera pas. Les CTE n'existent que depuis la version 2005.

Voici une solution avec une UDF pour SQL Server 2000 :

CREATE FUNCTION F_CONCAT_CH1CH2 (@num INT)
RETURNS VARCHAR(8000)
AS
BEGIN

DECLARE @Ch3 VARCHAR(8000)

SET @Ch3 = ''

SELECT @Ch3 = ch1 + ch2 +@Ch3
FROM ALACON
WHERE num = @num

RETURN @Ch3

END
GO

SELECT id, num, ch1, ch2, dbo.F_CONCAT_CH1CH2 (num) AS ch3
FROM ALACON

A +



>
> Merci encore !
>
> "Fred BROUARD" a écrit :
>
>
>>bonjour
>>
>>404 found a écrit:
>>
>>>bonjour,
>>>voici le schéma de ma table
>>>
>>>id num ch1 ch2 ch3
>>>----------------------------------------------
>>>1 1 A a
>>>2 1 B b
>>>3 1 C c
>>>4 2 D d
>>>
>>>le but est de mettre dans ch3 la concaténation de ch1 et ch2 groupé par num
>>>(c'est trés important) donc le but est d'avoir dans ma table à la fin :
>>>id num ch1 ch2 ch3
>>>----------------------------------------------
>>>1 1 A a AaBbCc
>>>2 1 B b AaBbCc
>>>3 1 C c AaBbCc
>>>4 2 D d Dd
>>>
>>>Des idées ?
>>
>>C'est possible en une seule requête...
>>
>>démonstration :
>>
>>CREATE TABLE ALACON
>>(id INT,
>> num INT,
>> ch1 CHAR(1),
>> ch2 CHAR(1))
>>
>>INSERT INTO ALACON VALUES (1, 1, 'A', 'a')
>>INSERT INTO ALACON VALUES (2, 1, 'B', 'b')
>>INSERT INTO ALACON VALUES (3, 1, 'C', 'c')
>>INSERT INTO ALACON VALUES (4, 2, 'D', 'd')
>>
>>Vous auriez pu avoir l'aimabilité de m'éviter de créer ces tables en proposant
>>par vous même de poster ce code. Simple politesse. D'autant qu'avec SQL server
>>en 3 clics, c'est possible !
>>
>>Solution en utilisant les expressions de table, dans ce cas sous forme récursive :
>>
>>WITH T_CONCAT
>>AS
>>(SELECT id, num, ch1, ch2, CAST(ch1 + ch2 AS VARCHAR(max)) AS ch3
>> FROM ALACON
>> UNION ALL
>> SELECT ALC.id, ALC.num, ALC.ch1, ALC.ch2, CTE.ch3 + ALC.ch1 + ALC.ch2
>> FROM ALACON ALC
>> INNER JOIN T_CONCAT AS CTE
>> ON ALC.id = CTE.id + 1 AND ALC.num = CTE.num)
>>SELECT A.*, ch3
>>FROM T_CONCAT C
>> INNER JOIN ALACON A
>> ON C.num = A.num
>>WHERE LEN(ch3) = (SELECT MAX(LEN(ch3)) FROM T_CONCAT WHERE num = C.num)
>>ORDER BY id, num
>>
>>Le résultat :
>>
>>id num ch1 ch2 ch3
>>----------- ----------- ---- ---- -----------------------
>>1 1 A a AaBbCc
>>2 1 B b AaBbCc
>>3 1 C c AaBbCc
>>4 2 D d Dd
>>
>>(4 row(s) affected)
>>
>>bien entendu cela n'est possible que si vous êtes sous SQL Server 2005. Étant
>>entendu que vous n'avez pas précisez votre version de MS SQL Server !
>>
>>
>>>Merci.
>>
>>A +
>>
>>--
>>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" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com
>>Audit, conseil, expertise, formation, modélisation, tuning, optimisation
>>********************* http://www.datasapiens.com" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.datasapiens.com ***********************
>>
>>

--
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" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.datasapiens.com ***********************