将行转换为列-SQL2005

将行转换为列-SQL2005,sql,sql-server-2005,tsql,stored-procedures,Sql,Sql Server 2005,Tsql,Stored Procedures,我有以下结果集 Status Wage --Columns Names (Table) ====== ===== Employed 10,000 我需要的是: Key Value DataType === ===== ======== Status Employed column data type e.g varchar Wage 10,000 decimal(18,2) 如何在SQL

我有以下结果集

Status       Wage     --Columns Names (Table)
======       =====   
Employed    10,000  
我需要的是:

Key     Value      DataType
===     =====      ========
Status  Employed   column data type e.g varchar
Wage    10,000     decimal(18,2)

如何在SQL 2005中使用TSQL实现这一点?您正在寻找的是PIVOT


您正在寻找的是PIVOT


可以使用信息模式、UNPIVOT、CAST和EXEC来完成。这里有一个有效的解决方案

CREATE TABLE #Data ([Status] int, [Wage] varchar(100), [Tax] decimal(10,3), BigText nvarchar(max))
INSERT #Data VALUES (7, '$12m', 123123.22, 'small island')

SELECT ORDINAL_POSITION, COLUMN_NAME, DATA_TYPE
+ CASE WHEN CHARACTER_MAXIMUM_LENGTH > 0 THEN '(' + CAST(CHARACTER_MAXIMUM_LENGTH AS nvarchar(10)) + ')' WHEN CHARACTER_MAXIMUM_LENGTH = -1 THEN '(max)' ELSE '' END
+ CASE WHEN DATA_TYPE IN ('numeric', 'decimal') AND NUMERIC_PRECISION > 0 THEN '(' + CAST(NUMERIC_PRECISION AS nvarchar(10)) 
    + CASE WHEN NUMERIC_SCALE > 0 THEN ',' + CAST(NUMERIC_SCALE AS NVARCHAR(10)) ELSE '' END
 + ')' ELSE '' END DATA_TYPE
INTO #Columns
FROM INFORMATION_SCHEMA.COLUMNS C
WHERE C.TABLE_NAME LIKE '#Data%'
ORDER BY C.ORDINAL_POSITION

DECLARE @selectList nvarchar(max), @columnNames nvarchar(max)

SELECT @selectList = ISNULL(@selectList + ',', '') + 'CAST(' + QUOTENAME(COLUMN_NAME) + ' AS nvarchar(max)) ' + QUOTENAME(COLUMN_NAME),
    @columnNames = ISNULL(@columnNames + ',', '') + QUOTENAME(COLUMN_NAME)
FROM #Columns

DECLARE @unpivot nvarchar(max)

SET @unpivot = '
    SELECT b.Column_Name, b.DataValue, c.Data_Type
    FROM
    (
        SELECT ' + @selectList + ' FROM #Data
    ) a
    UNPIVOT (DataValue FOR Column_Name IN (' + @columnNames + ')) b
    JOIN #Columns c ON c.Column_Name = b.Column_Name
'

EXEC (@unpivot)

可以使用信息模式、UNPIVOT、CAST和EXEC来完成。这里有一个有效的解决方案

CREATE TABLE #Data ([Status] int, [Wage] varchar(100), [Tax] decimal(10,3), BigText nvarchar(max))
INSERT #Data VALUES (7, '$12m', 123123.22, 'small island')

SELECT ORDINAL_POSITION, COLUMN_NAME, DATA_TYPE
+ CASE WHEN CHARACTER_MAXIMUM_LENGTH > 0 THEN '(' + CAST(CHARACTER_MAXIMUM_LENGTH AS nvarchar(10)) + ')' WHEN CHARACTER_MAXIMUM_LENGTH = -1 THEN '(max)' ELSE '' END
+ CASE WHEN DATA_TYPE IN ('numeric', 'decimal') AND NUMERIC_PRECISION > 0 THEN '(' + CAST(NUMERIC_PRECISION AS nvarchar(10)) 
    + CASE WHEN NUMERIC_SCALE > 0 THEN ',' + CAST(NUMERIC_SCALE AS NVARCHAR(10)) ELSE '' END
 + ')' ELSE '' END DATA_TYPE
INTO #Columns
FROM INFORMATION_SCHEMA.COLUMNS C
WHERE C.TABLE_NAME LIKE '#Data%'
ORDER BY C.ORDINAL_POSITION

DECLARE @selectList nvarchar(max), @columnNames nvarchar(max)

SELECT @selectList = ISNULL(@selectList + ',', '') + 'CAST(' + QUOTENAME(COLUMN_NAME) + ' AS nvarchar(max)) ' + QUOTENAME(COLUMN_NAME),
    @columnNames = ISNULL(@columnNames + ',', '') + QUOTENAME(COLUMN_NAME)
FROM #Columns

DECLARE @unpivot nvarchar(max)

SET @unpivot = '
    SELECT b.Column_Name, b.DataValue, c.Data_Type
    FROM
    (
        SELECT ' + @selectList + ' FROM #Data
    ) a
    UNPIVOT (DataValue FOR Column_Name IN (' + @columnNames + ')) b
    JOIN #Columns c ON c.Column_Name = b.Column_Name
'

EXEC (@unpivot)

该链接上的示例显示了一个平均值..我的只是一个直接转换..任何语法帮助都会有用这有帮助吗?该链接上的示例显示了一个平均值..我的只是一个直接转换..任何语法帮助都会有用这有帮助吗?