Рассмотрим следующий запрос:
DECLARE @T1 TABLE(
[Id] [int] IDENTITY(1,1) NOT NULL,
[Data] VARCHAR(100),
[Column1] VARCHAR(100),
[Column2] VARCHAR(100),
[Column3] VARCHAR(100));
INSERT INTO @T1([Data],[Column1],[Column2],[Column3])
VALUES
('Data1','C11','C21','C31'),
('Data2','C12','C22','C32'),
('Data3','C13','C23','C33'),
('Data4','C14','C24','C34'),
('Data5','C15','C25','C35');
SELECT * FROM @T1;
Вывод выглядит следующим образом:
Теперь мы хотим сохранить столбец «Данные» и для каждого другого столбца складывать результат выбора для этого столбца в финальную таблицу. Другими словами, следующий запрос производит вывод:
-- I am looking for a better solution than below!
DECLARE @output TABLE([Data] VARCHAR(100),[Column] VARCHAR(100));
INSERT INTO @output([Data],[Column])
(SELECT [Data],[Column1] FROM @T1
UNION
SELECT [Data],[Column2] FROM @T1
UNION
SELECT [Data],[Column3] FROM @T1)
SELECT * FROM @output
Что может быть лучше, чем выше, для получения конечного результата? Поскольку число столбцов увеличивается, это означает, что для каждого нового столбца мне нужно иметь отдельную вставку, которая кажется грубым решением. В идеале я ищу решение, основанное на сводных данных, но я не смог придумать что-то конкретное.