[SQL] Concaténer les valeurs d’une colonne

Tout est dans le titre… et j’avoue avoir un peu réfléchi pour savoir quelle était la meilleure solution.
La plus simple est un curseur bien sûr mais ils ne sont pas utilisables dans tous les cas, et on peut souhaiter le faire en une seule requête.

Mon problème étant que c’est une requête pour du reporting, qui doit me renvoyer, pour chaque pays, la liste des types de paiements disponibles.

Etant un ancien féru d’Oracle, j’ai tout de suite pensé CONNECT BY PRIOR, ce qui, en SQL, veut dire… CTE. Le principe est simple: on va émuler une parent child de chaque enregistrement avec le précédent et concaténer a chaque récursion: on va obtenir n lignes dont la dernière sera la concaténation des champs de la colonne.

/* 1) On definit la CTE */
WITH COLCAT(ID_PERE,CAT) AS
(
/* 2) L’ancre est une valeur fixe: c’est le premier enfant de la recursion. Il a pour parent 1 c’est a dire le premier enregistrement de la partie recursive*/
SELECT 1,CONVERT(VARCHAR(255), »)

UNION ALL
/* 2) La partie recursive marche ainsi: on numerote les enregistrements de la table avec un ROW_NUMBER. On genere l’ID du parent en le definissant comme cet indice + 1. De cette facon le dernier enregistrement n aura pas de parent CQFD. */
SELECT ID_PERE+1 AS ID_PERE,
CONVERT(VARCHAR(255),CAT+T.LABEL+’,’) AS CAT
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY PMN_ID) AS ID,
PMN_LABEL AS LABEL
FROM D_PAYMENTMEAN
)
AS T

INNER JOIN COLCAT
ON T.ID=COLCAT.ID_PERE
)

SELECT TOP 1 CAT
FROM COLCAT
ORDER BY ID_PERE DESC

On obtient donc la concaténation souhaitée:

———————————————————-
Unbekannt,Überweisung Ausland,Überweisung Inland,Unbekannt

(1 row(s) affected)

Oui je bosse actuellement en Germanie…
Bonne concaténation à tous!

A bientôt!

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s