更改动态数据透视表结果中的列名称

时间:2015-12-21 17:13:46

标签: sql tsql sql-server-2012

我有一个tsql动态数据透视表查询,虽然我对最终输出中的列名不满意但工作正常。

要使其正常工作,用户必须从200个水果名称列表中选择最多20个水果名称。然后我构建了数据透视表,所以每次运行select时我都会得到不同的列名。 例如: 第一次列名称是:apple,orange和pear 第二次是:.orange,香蕉,猕猴桃和苹果

我的问题是:是否有可能拥有静态名称,例如:第一列的名称总是“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

2 个答案:

答案 0 :(得分:1)

是的,但它会使您的查询更加复杂。

您需要返回从@IDList生成的可能列名的列表,并将其转换为比当前SELECT *更复杂的SELECT子句。

当你得到它时,使用一些SQL字符串拆分代码将@IDList转换为带有位置参数的项目表。将AS <whatever>附加到您想要的任意末尾,并使用FOR XML PATH技巧将其展平,并且您已经有了一个SELECT子句,可以执行您想要的操作。但是,正如我所说,你的代码现在变得更加复杂。

顺便说一句 - 我真的希望@idList完全不可能完成任何用户输入,或者从这个演示的真实代码中大大简化。否则你就会在那里找到一个很大的SQL注入漏洞。

答案 1 :(得分: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