我有一个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
答案 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