Генерация строки / столбцов для отдельных символов с использованием CTE - PullRequest
2 голосов
/ 20 июня 2011

У меня есть таблица ввода ниже

Input

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

Ожидаемый результат

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

Каждое число в столбце данных будет рассматриваться как столько же символов X. Так что, если расширить первый Resord, который является "a2b" это становится AXXB. это будет длина 4. Представляя в столбцах, это будет a, b, c и d. И поскольку он находится в первом ряду, следовательно, вывод будет

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

ddl как под

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'

Ищем решение на основе cte.

Заранее спасибо

1 Ответ

1 голос
/ 20 июня 2011

Как я и обещал, я бы сделал лучшее решение сегодня. Я знаю, что вам понравится и, скорее всего, использовать его.

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