Есть таблица ключ-значение, клюю связаны между собой некоторым полем, нужно написать селект, который вернёт таблицу, поля которой будут иметь названия ключей, а строки - соответствующие значения. Проще говоря транспонировать таблицу.
Поменять колонки и строки SQL запросом(MS SQL)
1
Спросил
Новые ответы
2
Вообще если количество строк не фиксировано и нужно использовать один селект, то это интересный вопрос. А если же нет, то можно сформировать динамический запрос и выполнить его, где-то так
-- таблица ключей
DECLARE @keys TABLE(Id INT, Value NVARCHAR(MAX));
INSERT INTO @keys
VALUES (1, '1'), (2, '2'), (3, '3');
-- таблица значений
DECLARE @values TABLE(Id INT, Value NVARCHAR(MAX));
INSERT INTO @values
VALUES (1, '1'), (3, '3');
-- работаем через курсор
DECLARE cur CURSOR LOCAL FAST_FORWARD FOR
SELECT k.Value AS [Key],
v.Value AS [Value]
FROM @keys k
LEFT JOIN @values v
ON k.Id = v.Id;
DECLARE @query NVARCHAR(MAX) = 'SELECT ',
@key NVARCHAR(MAX),
@value NVARCHAR(MAX);
OPEN cur;
FETCH NEXT FROM cur
INTO @key, @value;
-- формируем строку запроса
WHILE @@FETCH_STATUS = 0
BEGIN
SET @query = @query + CASE WHEN @value IS NULL THEN 'NULL' ELSE '''' + @value + '''' END + ' AS [' + @key + ']';
FETCH NEXT FROM cur
INTO @key, @value;
IF @@FETCH_STATUS = 0
SET @query = @query + ', ';
END;
CLOSE cur;
DEALLOCATE cur;
-- выполняем запрос
EXEC (@query);
Ради всего святого, не приучайте автора к курсорам в MSSQL... :(((
А что плохого в курсорах? Поделитесь своим более адекватным решением?
Причина неприязни к курсорам проста - это тормозно. Поверьте, в MSSQL (именно в этой СУБД) к курсорам прибегают в крайних случаях. Касательно вопроса автора - я предлагал свое решение, но его вычистили здешние админы. Решение простое - оператор PIVOT.
Красота! Спасибо! Раньше не встречал этот оператор