【问题标题】:Create New Table with Unpivot and Dynamic Columns使用 Unpivot 和动态列创建新表
【发布时间】:2017-08-28 18:03:14
【问题描述】:

我一直在尝试使用动态列对大型数据库进行反透视,同时保留两个索引列。我无法将它保存为 SQL Server Management Studio 中的新表作为新表。现在我得到“一个 INSERT 语句不能包含一个将值分配给变量的 SELECT 语句。”

DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);

create table pivot_columns ([Prime Item Nbr] NVARCHAR(MAX), [Store Nbr] NVARCHAR(MAX))


insert into pivot_columns

select @cols = STUFF((SELECT distinct ',' +
                        QUOTENAME(column_name)
                      FROM information_schema.columns
                      WHERE table_name = 'POSSalesMicro'
                        AND COLUMN_NAME <> 'Prime Item Nbr' 
                        AND COLUMN_NAME <> 'Store Nbr'
                      FOR XML PATH(''), TYPE
                     ).value('.', 'NVARCHAR(MAX)') 
                        , 1, 1, '');




SELECT @query = 'WITH Unpivoted 
                AS
                (
                    SELECT [Prime Item Nbr], [Store Nbr], columns, value
                    FROM POSSalesMicro
                    UNPIVOT
                    (
                       columns
                       FOR value IN('+ @cols + ')
                    ) AS u
                ) 
                SELECT 
                  [Prime Item Nbr], 
                  [Store Nbr],
                  columns,
                  CAST(CASE WHEN value LIKE ''% POS Sales'' THEN REPLACE(value,''POS Sales'', '''')
                       WHEN value LIKE ''LR%'' THEN REPLACE(value,''LR '', '''')
                  END AS INT) AS WMWeek
                FROM Unpivoted';


EXECUTE(@query);

【问题讨论】:

    标签: sql-server dynamic unpivot


    【解决方案1】:

    您需要将插入部分作为动态 sql 的一部分。类似的东西。

    select @cols = STUFF((SELECT distinct ',' +
                            QUOTENAME(column_name)
                          FROM information_schema.columns
                          WHERE table_name = 'POSSalesMicro'
                            AND COLUMN_NAME <> 'Prime Item Nbr' 
                            AND COLUMN_NAME <> 'Store Nbr'
                          FOR XML PATH(''), TYPE
                         ).value('.', 'NVARCHAR(MAX)') 
                            , 1, 1, '');
    
    SELECT @query = 'WITH Unpivoted 
                    AS
                    (
                        SELECT [Prime Item Nbr], [Store Nbr], columns, value
                        FROM POSSalesMicro
                        UNPIVOT
                        (
                           columns
                           FOR value IN('+ @cols + ')
                        ) AS u
                    ) 
                    insert into pivot_columns (' + @cols + ') 
                    SELECT 
                      [Prime Item Nbr], 
                      [Store Nbr],
                      columns,
                      CAST(CASE WHEN value LIKE ''% POS Sales'' THEN REPLACE(value,''POS Sales'', '''')
                           WHEN value LIKE ''LR%'' THEN REPLACE(value,''LR '', '''')
                      END AS INT) AS WMWeek
                    FROM Unpivoted';
    
    exec sp_executesql @query
    

    【讨论】:

    • 我第一次看到动态与枢轴。那时开始很难调试哈哈。 +1
    猜你喜欢
    • 2023-03-27
    • 2022-08-16
    • 2017-09-29
    • 2022-10-06
    • 2016-01-22
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多