【问题标题】:Transpose rows to columns - SQL2005将行转置为列 - SQL 2005
【发布时间】:2010-11-04 11:54:43
【问题描述】:

我有以下结果集

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 来实现这一点

【问题讨论】:

    标签: sql sql-server-2005 tsql stored-procedures


    【解决方案1】:

    【讨论】:

    【解决方案2】:

    可以使用 INFORMATION_SCHEMA、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)
    

    【讨论】:

      猜你喜欢
      • 2012-03-19
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多