У меня есть некоторые данные, как показано ниже
ID Data
1 a
1 2
1 b
1 1
2 d
2 3
2 r
Требуемый вывод
ID Data
1 a
1 NULL
1 NULL
1 b
1 NULL
2 d
2 NULL
2 NULL
2 NULL
2 r
Что такое выход, для чисел он заменяется многими значениями NULL.Например, для числового значения 2 это будет 2 пустых значения.
Значение ddl соответствует
Declare @t table(ID int, data varchar(10))
Insert into @t
Select 1, 'a' union all select 1, '2' union all select 1, 'b' union all select 1, '1' union all select 2,'d' union all
select 2,'3' union all select 2, 'r'
select * from @t
Пожалуйста, дайте решение на основе CTE.У меня уже есть процедурный подход, но мне нужно иметь представление о решении на основе CTE.
Решение, которое я использую в настоящее время
CREATE FUNCTION [dbo].[SPLIT] (
@str_in VARCHAR(8000)
)
RETURNS @strtable TABLE (id int identity(1,1), strval VARCHAR(8000))
AS
BEGIN
DECLARE @tmpStr VARCHAR(8000), @tmpChr VARCHAR(5), @ind INT = 1, @nullcnt INT = 0
SELECT @tmpStr = @str_in
WHILE LEN(@tmpStr) >= @ind
BEGIN
SET @tmpChr = SUBSTRING(@tmpStr,@ind,1)
IF ISNUMERIC(@tmpChr) = 0
INSERT INTO @strtable SELECT @tmpChr
ELSE
WHILE @nullcnt < @tmpChr
BEGIN
INSERT INTO @strtable SELECT NULL
SET @nullcnt = @nullcnt + 1
END
SELECT @ind = @ind + 1, @nullcnt = 0
END
RETURN
END
GO
Вызов
SELECT * from dbo.SPLIT('abc2e3g')
Я не хочу делать это, используя функцию, но решение CTE.
Причина: Я изучаю CTE и пытаюсь решить проблемы, используя его.Пытаться выйти из процедурного / рБар подхода.
Спасибо