【问题标题】:change column names in a dynamic pivot table result更改动态数据透视表结果中的列名
【发布时间】:2016-03-27 20:13:20
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql tsql sql-server-2012


    【解决方案1】:

    当然.. 刚刚创建了一个新变量来保存列别名和 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
    

    【讨论】:

      【解决方案2】:

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

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

      完成后,使用一些 SQL 字符串拆分代码将 @IDList 转换为带有位置参数的项目表。将AS <whatever> 附加到任何您想要的末尾,并使用 FOR XML PATH 技巧将其展平,您就有了一个 SELECT 子句,它可以满足您的需求。但是,正如我所说,您的代码现在要复杂得多。

      顺便说一句 - 我真的希望@idList 要么完全不可能让任何用户输入达到,要么大大简化了您的实际代码以进行此演示。否则你就会有一个很大的 SQL 注入漏洞。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-08
        • 2017-07-30
        • 1970-01-01
        • 2019-12-22
        • 1970-01-01
        • 2019-12-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多