akarsha Ответов: 1

Pivot varchar поля динамически с или без агрегата в SQL


У меня есть таблица, как показано ниже

TName Scode
AKAT Allow1
AKAT Allow2
AKAT Allow3
AKAT Allow4
AkCT Allow1
AKCT Allow2
AKCT Allow3
AKST Allow1
Акст Allow2
AKST Allow3
Акст Allow4
Акст Allow5
. .
. .
. .


Я хочу получить результат как показано ниже:

АКАТЬ AKCT АКСТ . . .
Allow1 Allow1 Allow1....
Allow2 Allow2 Allow2....
Allow3 Allow3 Allow3....
Allow4 Allow4 .
Allow5

Что я уже пробовал:

Я пробовал несколько запросов, гугля, но ни один из них не помог.

Там может быть много Tnames, поэтому у меня не может быть статического запроса. а поля-это тип данных varchar, поэтому я не уверен, что aggregate можно использовать.

Я могу добавить столбец TID в таблицу в качестве числового поля, но эти TID будут одинаковыми для конкретного Tname. если это полезно для запросов.

1 Ответов

Рейтинг:
4

Maciej Los

Проверить это:

CREATE TABLE #tmp (TName VARCHAR(30), Scode VARCHAR(30))

INSERT INTO #tmp(TName, Scode)
VALUES('AKAT', 'Allow1'),
('AKAT', 'Allow2'),
('AKAT', 'Allow3'),
('AKAT', 'Allow4'),
('AkCT', 'Allow1'),
('AKCT', 'Allow2'),
('AKCT', 'Allow3'),
('AKST', 'Allow1'),
('AKST', 'Allow2'),
('AKST', 'Allow3'),
('AKST', 'Allow4'),
('AKST', 'Allow5')

DECLARE @cols NVARCHAR(4000) = STUFF((SELECT DISTINCT '],[' + TName
				FROM #tmp
				ORDER BY '],[' + TName
				FOR XML PATH('')) , 1, 2, '') + ']'

--SELECT @cols

DECLARE @Qry NVARCHAR(MAX) = N'
SELECT RowNo, ' + @cols +
'FROM (
	SELECT ROW_NUMBER() OVER(PARTITION BY TName ORDER BY Scode) As RowNo, *
	FROM #tmp
	) dt
PIVOT (MAX(Scode) FOR TName IN(' + @cols + ')) pvt'

EXEC(@Qry)

DROP TABLE #tmp


Результат:
RowNo	AKAT	AkCT	AKST
1		Allow1	Allow1	Allow1
2		Allow2	Allow2	Allow2
3		Allow3	Allow3	Allow3
4		Allow4	NULL	Allow4
5		NULL	NULL	Allow5


akarsha

Большое спасибо. Это сработало именно так, как я хотел :).

Maciej Los

Всегда пожалуйста.