2015-12-21 3 views
2

У меня есть динамический сводный столбец tsql, который отлично работает, хотя я не доволен именами столбцов в конечном выпуске.изменить имена столбцов в результате динамической сводной таблицы

Чтобы сделать его работу, пользователь должен выбрать до 20 названий фруктов из списка из 200 названий фруктов. Затем я создаю сводную таблицу, поэтому каждый раз, когда выполняется выбор, я получаю разные имена столбцов. Например: Впервые имена столбцов: яблоко, апельсин и груша второй раз: .orange, банан, киви и яблоко

Мой вопрос: Есть ли вешать иметь статические имена, как, например, : имя первого столбца всегда «col_1», второй столбец «col_2» и т. д.?

ЗЕЬЕСТ выглядит следующим образом:

DECLARE @idList varchar(800) 
DECLARE @sql nvarchar(max) 

SELECT @idList = coalesce(@idList + ', ', '') + '['+ltrim(rtrim(id_producto)) +']' 
from gestor_val_pos 
group by id_producto order by id_producto 

SELECT @sql = 'select * from #correlaciones pivot (max (correl) 
for codigo2 in (' + @IDlist + ')) AS pvt order by codigo1;' 

exec sp_executeSQL @sql 

ответ

0

уверен .. только что создали новую переменную для хранения псевдонимов столбцов и row_number, чтобы получить номер столбца.

DECLARE @idList varchar(800) 
DECLARE @idListAlias varchar(800) 
DECLARE @sql nvarchar(max) 

SELECT 
    @idList = coalesce(@idList + ', ', '') + '['+ltrim(rtrim(id_producto)) +']', 
    @idListAlias = coalesce(@idListAlias + ', ', '') + '['+ltrim(rtrim(id_producto)) +'] as col_' + CONVERT(VARCHAR(10), ROW_NUMBER() OVER(ORDER BY id_producto)) 
from gestor_val_pos 
group by id_producto order by id_producto 

SELECT @sql = 'select ' + @idListAlias + ' from #correlaciones pivot (max (correl) 
for codigo2 in (' + @IDlist + ')) AS pvt order by codigo1;' 

exec sp_executeSQL @sql 
1

Да, но это сделает ваш запрос значительно более сложным.

Вам нужно будет вернуть список возможных имен столбцов, сгенерированных из @IDList, и преобразовать их в предложение SELECT, более сложное, чем ваш текущий SELECT *.

Если у вас это есть, используйте некоторый код разделения строки SQL, чтобы преобразовать @IDList в таблицу элементов с параметром position. Приложите AS <whatever> к концу любого из них и используйте трюк FOR XML PATH, чтобы сгладить его, и у вас есть предложение SELECT, которое будет делать то, что вы хотите. Но, как я уже сказал, ваш код теперь значительно сложнее.

В качестве альтернативы действительно Надеюсь, что @idList либо полностью невозможно для любого пользовательского ввода, который когда-либо был достигнут или был чрезвычайно упрощен от вашего реального кода для этой демонстрации. В противном случае у вас есть большое отверстие для инъекций SQL прямо там.