使用column_names

时间:2019-11-18 08:13:06

标签: sql sql-server database pivot

我想在数据透视选择中选择一行,该选择使用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中放入列名

2 个答案:

答案 0 :(得分:2)

您在寻找这个吗?

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语句,以使其适用于每个表/视图。

答案 1 :(得分:1)

这是您的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;