【问题标题】:Create one row pivot select using column_names使用 column_names 创建一行数据透视选择
【发布时间】:2019-11-18 08:13:06
【问题描述】:

我想让一行选择成为使用 db 中的列名的枢轴选择。

编辑:

SELECT *
FROM COR.PARAMETER_GROUP AS t WHERE  GROUP_CODE = '555' 
UNPIVOT
(
  COLUMN_NAME
  FOR VALUE IN(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'PARAMETER_GROUP' AND TABLE_SCHEMA='COR' ORDER BY ORDINAL_POSITION ASC)
) AS u   

--

       COLUMN1 COLUMN2 COLUMN3 COLUMN4 COLUMN5
ROW       1       2       3       4       5

=

*COLUMN_NAME VALUE*
COLUMN1       1
COLUMN2       2
COLUMN3       3
COLUMN4       4

基本上我试试这个,但我不能把列名放在FOR

【问题讨论】:

    标签: sql sql-server database pivot


    【解决方案1】:

    你在找这个吗:

    CREATE TABLE #DataSource
    (
        [name] SYSNAME
       ,[pos] INT
    );
    
    INSERT INTO #DataSource ([name], [pos])
    SELECT COLUMN_NAME
          ,ORDINAL_POSITION
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE [TABLE_NAME] = 'PARAMETER_GROUP'
        AND TABLE_SCHEMA='COR';
    
    DECLARE @DynammicTSQLStatement NVARCHAR(MAX)
           ,@DynamicPIVOTColumns NVARCHAR(MAX);
    
    
    SET @DynamicPIVOTColumns = STUFF
                              (
                                    (
                                    SELECT ',' + QUOTENAME([name])
                                    FROM #DataSource
                                    ORDER BY [pos]
                                    FOR XML PATH('') ,TYPE
                                    ).value('.', 'NVARCHAR(MAX)')
                                    ,1
                                    ,1
                                    ,''
                              );
    
    SET @DynammicTSQLStatement = N'
    SELECT *
    FROM #DataSource
    PIVOT
    (
        MAX([pos]) FOR [name] IN (' + @DynamicPIVOTColumns + ')
    ) PVT';
    
    EXEC sp_executesql @DynammicTSQLStatement;
    
    DROP TABLE #DataSource;
    

    我正在使用动态 T-SQL 语句来构建 PIVOT 语句,以使其适用于每个表/视图。

    【讨论】:

    • 感谢您的回复和努力。我想要做的是创建一个通用的选择语句,它总是将一行返回到一个枢轴选择中。您所做的是插入列名的序数位置。用行值替换它,这正是我想要的。
    【解决方案2】:

    这是你的dynamic query

    declare  @cols nvarchar(max);
    declare  @sql nvarchar(1000);
    
    select @cols =
    STUFF((select N',' + QUOTENAME([COLUMN_NAME])
           from (SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'PARAMETER_GROUP' AND TABLE_SCHEMA='COR') t1
           FOR XML PATH('')
          ), 1, 1, '') + N'';
    
    set @sql = N'select  ' + @cols + N' from 
                 (
                    SELECT cast(ordinal_position as varchar(50)) as ordinal_position
                    , column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ''PARAMETER_GROUP'' AND TABLE_SCHEMA=''COR''
                ) t1
                pivot 
                (
                    max(t1.ordinal_position)
                    for t1.column_name in (' + @cols + N')
                ) p '
    
    exec sp_executesql @sql;
    

    【讨论】:

    • 编辑了我的问题以使其清楚。也感谢回复
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多