Поменять колонки и строки SQL запросом(MS SQL) - CodeHelper

Поменять колонки и строки 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);
Senya_L

Ради всего святого, не приучайте автора к курсорам в MSSQL... :(((

GarF1eld

А что плохого в курсорах? Поделитесь своим более адекватным решением?

Senya_L

Причина неприязни к курсорам проста - это тормозно. Поверьте, в MSSQL (именно в этой СУБД) к курсорам прибегают в крайних случаях. Касательно вопроса автора - я предлагал свое решение, но его вычистили здешние админы. Решение простое - оператор PIVOT.

GarF1eld

Красота! Спасибо! Раньше не встречал этот оператор


v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.