2015-12-21 92 views
2

我有一個tsql動態數據透視表查詢,雖然我對最終輸出中的列名不滿意,但它工作正常。更改動態數據透視表中的列名結果

要使其發揮作用,用戶必須從200個水果名稱列表中選擇最多20個水果名稱。然後我構建數據透視表,以便每次運行選擇時都會得到不同的列名稱。 例如: 第一次列名分別是:蘋果,橘子和梨 二時間:.orange,香蕉,獼猴桃和蘋果

我的問題是:是否有posibility具有靜態的名字,例如像:第一列的名稱總是「col_1」,第二列「col_2」等?

的select語句如下:

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轉換爲帶有位置參數的項目表。將AS <whatever>追加到任何你想要的結尾,並使用FOR XML PATH技巧將其平滑回來,並且你有一個SELECT子句可以做你想做的事。但是,正如我所說,你的代碼現在顯得更加複雜。

撇開 - 我真的希望@idList是完全不可能的任何用戶輸入到達或極大地簡化您的真實代碼的演示。否則,你在那裏會有一個很大的SQL注入漏洞。