【问题标题】:How to Pivot a Numeric Column in T SQL?如何在 T SQL 中旋转数字列?
【发布时间】:2020-06-16 06:00:59
【问题描述】:

我有一张这样的数据表:

我需要编写一个 T-SQL 查询来转换数据以得到这样的结果:

【问题讨论】:

    标签: sql sql-server tsql pivot


    【解决方案1】:

    您可以通过从字符串变量执行 SQL 语句来使用某种动态查询

    概念大致如下:

    首先,声明变量

    DECLARE @pivotcolumns NVARCHAR(MAX) = '', 
        @sqlquery     NVARCHAR(MAX) = '';
    

    获取所有 mode_code 并将它们存储到变量 @pivotcolumns

    SELECT 
        @pivotcolumns+=QUOTENAME(mode_code) + ','
    FROM 
        the_table
    ORDER BY 
        mode_code;
    
    SET @pivotcolumns = LEFT(@pivotcolumns, LEN(@pivotcolumns) - 1);
    

    如果我们打印@pivotcolumns,它将变成'0','1','2','...'

    得到所有列后,将它们解析成一个字符串用于SQL查询

    SET @sqlquery ='
    SELECT * FROM (
        select mode_code, time_spent
        from the_table) t
    PIVOT(
        SUM(time_spent) 
        FOR mode_code IN ('+ @pivotcolumns +')
    ) AS pivot_table;';
    

    当你完成了一个 SQL 查询字符串之后,我们可以使用 sp execute SQL 来执行它

    EXECUTE sp_executesql @sqlquery;
    

    【讨论】:

    • 使用变量赋值连接字符串 (SELECT @Column += ....) 是 undocumented and unreliable。它并不总是按预期工作。您应该使用STRING_AGG(如果使用支持它的版本),或者使用XML Extensions 将行连接成一个变量
    猜你喜欢
    • 2017-09-25
    • 1970-01-01
    • 2021-11-27
    • 2017-04-24
    • 1970-01-01
    • 2012-05-08
    • 2017-01-20
    • 1970-01-01
    • 2010-12-17
    相关资源
    最近更新 更多