2010-11-04 100 views
1

我有以下結果集移調行列 - SQL2005

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中實現使用TSQL 2005

回答

1

它可以通過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) 
3
+0

該鏈接上的示例顯示了一個平均的流量..mine只是一個直接的變換......任何語法幫助將會有幫助 – chugh97 2010-11-04 12:11:27

+0

這有幫助嗎? http://stackoverflow.com/questions/24470/sql-server-pivot-examples – 2010-11-04 12:19:38