2014-02-24 4 views
2

30 개의 열이있는 테이블이 있고 모든 열을 쉽게 unpivot 싶습니다. 나는이 전략을 사용할 수 있습니다 이해 :SQL 테이블의 모든 열 피벗 해제

SELECT col, value 
INTO New_Table 
FROM 
(SELECT * FROM Test_Data) p 
UNPIVOT 
(value FOR col IN (Column_Name1, Column_Name2... Column_Name30)) as unpvt 

내 데이터에 제공하는 방법이 있습니다 :

Column_Name1 Column_Name2 Column_Name3 
Value11   Value21   Value31 
Value12   Value22   Value32 
Value13   Value23   Value33 

이 내가 새 테이블에 저장하는 방법입니다 :

New_Column1 New_cloumn2 
Column_Name1 Value11 
Column_Name1 Value12 
Column_Name1 Value13 
Column_Name2 Value21 
... 

그러나 30 열 이름을 입력하는 것보다 쉬운 방법이 있어야합니다.

미리 감사드립니다.

+0

실제로 30 개의 열이 모두 하나의 열로 처리되어야하는 상황이라면 데이터 모델이 처음부터 심각하게 잘못되었음을 알리는 신호입니다. 왜 자신의 문제를 해결할 수있는 "쉬운 방법"이 있어야합니까? –

+0

30 개의 열을 입력하는 것이 얼마나 힘듭니다? – adrianm

+0

@adrianm 30 개의 열은 각각 32 자 코드입니다. – user3347843

답변

6

이것은 깨진 데이터 모델처럼 보이지만 열 목록을 입력하지 않아도됩니다.

당신은 열 목록 생성이를 사용할 수 있습니다

SELECT name 
FROM sys.columns 
WHERE objecT_id = OBJECT_ID('Test_Data') 

그리고 : 그런 다음 동적 SQL 문에 그 목록을 사용할 수 있습니다

DECLARE @List VARCHAR(MAX) = STUFF((SELECT DISTINCT ',' + QUOTENAME(name)      
            FROM sys.columns 
            WHERE objecT_id = OBJECT_ID('Test_Data')          
            FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)') 
            ,1,1,'') 
PRINT @List 

:

DECLARE @List VARCHAR(MAX) = STUFF((SELECT DISTINCT ',' + QUOTENAME(name)      
            FROM sys.columns 
            WHERE objecT_id = OBJECT_ID('Test_Data')          
            FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)') 
            ,1,1,'') 
     ,@sql VARCHAR(MAX) 
SET @sql = 'SELECT col,value 
       INTO New_Table 
       FROM (SELECT * FROM Test_Data) p 
       UNPIVOT (value FOR col IN ('[email protected]+')) as unpvt 
       ' 
EXEC (@sql) 

EXEC을 사용하기 전에 PRINT (@sql)을 사용하여 동적 쿼리를 확인하시기 바랍니다. 후에 있었다.