2 votes

Génération de lignes/colonnes pour des caractères individuels à l'aide de CTE

J'ai le tableau d'entrée ci-dessous

Input

ID  Row Data
1   1   a2b
1   2   p1d1
2   1   abcd

Résultats attendus

ID  RowCol  Chars
1   a1  a
1   b1  X
1   c1  X
1   d1  b
1   a2  p
1   b2  X
1   c2  d
1   d2  X
2   a1  a
2   b1  b
2   c1  c
2   d1  d

Chaque nombre dans la colonne de données sera traité comme autant de X. Ainsi, si l'on développe le premier résultat qui est 'a2b', cela devient aXXB. il devient aXXB, c'est-à-dire que la longueur sera de 4. La représentation en colonnes sera a, b, c et d. Et comme il est dans la première ligne, la sortie sera donc

ID  RowCol  Chars
1   a1  a
1   b1  X
1   c1  X
1   d1  b

Le ddl est le suivant

Declare @t table(ID int , Row int, Data varchar(10))
Insert into @t 
Select 1, 1,'a2b' Union All Select 1,2,'p1d1' Union All Select 2,1,'abcd'

Vous recherchez une solution basée sur le cte.

Merci d'avance

1voto

t-clausen.dk Points 17925

Comme je l'ai promis, je vais faire une meilleure solution aujourd'hui. Je sais que vous l'apprécierez et l'utiliserez très probablement.

DECLARE @t TABLE(ID INT , Row INT, Data VARCHAR(10)) 
Insert INTO @t  
SELECT 1, 1,'a2b' UNION All SELECT 1,2,'p1d1' UNION All SELECT 2,1,'abcd'

;WITH cte(id, row, num, data) 
AS ( 
SELECT id, row, 1 num,CAST(data as VARCHAR(10)) data
FROM @t
UNION ALL 
SELECT ch.id, row, CH.num +1,  CAST(REPLACE(ch.data, ch.num, REPLICATE('X', ch.num)) as VARCHAR(10))
FROM cte ch
WHERE ch.num < 9 )
, cte2(id, rowcol, row, num, data, chars, LEVEL)  as
(SELECT  id, CHAR(97) + CAST(row AS CHAR) rowcol, row, num, data, SUBSTRING(data, 1, 1), 1 LEVEL
FROM cte 
where num =  9
UNION all
SELECT id, CHAR(97 + LEVEL) + CAST(row AS CHAR) rowcol, row, num, data, SUBSTRING(data, LEVEL + 1, 1), LEVEL + 1
FROM cte2 ch
where LEVEL < LEN(data)
)
SELECT ID, rowcol, chars 
FROM CTE2
ORDER BY id, data, rowcol

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X