2016-05-31 4 views
2

질문이 중복되면 사과하지만 신경이 부 풀리는 몇 가지 요구 사항이 있습니다. 그리고 많은 시도 끝에 나는 그것을 풀 수 없습니다.각 열에 대해 열을 행으로 변환

Column_name  Column_Value 

CHANGE_NUMBER MD04086 
ITEM_NUMBER  710851-1 
REV    B 
BOM_ITEM  230248-0 
FIND_NUMBER  0 
QUANTITY  9 
CHANGE_NUMBER MD04086 
ITEM_NUMBER  710851-1 
REV    B 
BOM_ITEM  230289-0 
FIND_NUMBER  0 
QUANTITY  4 

지금까지 내가 사용했다 :

CHANGE_NUMBER ITEM_NUMBER REV BOM_ITEM FIND_NUMBER QUANTITY 
MD04086   710851-1 B 230248-0   0 9 
MD04086   710851-1 B 230289-0   0 4 
MD04086   710851-1 B 230292-0   0 1 
MD04086   710851-1 B 230298-0   0 2 

내가이 데이터에 대해 수행 할 것은 다음과 같은 형식으로 만드는 것입니다 : 요구 사항은 내가 다음과 같이 데이터가있는 테이블을 가지고있다 쿼리를 다음하지만 내가

with q1 as 
(select 'itemRev' as column_name,[CHANGE_NUMBER] as column_value from generalassemblies_data_final 
union all 

select 'itemNumber' as column_name,[ITEM_NUMBER] as column_value from generalassemblies_data_final 
union all 

select 'REV' as column_name,[REV] as column_value from generalassemblies_data_final 
union all 

select 'BOM_ITEM' as column_name,[BOM_ITEM] as column_value from generalassemblies_data_final 
union all 

select 'findNum' as column_name,[FIND_NUMBER] as column_value from generalassemblies_data_final 
union all 

select 'qty' as column_name,[QUANTITY] as column_value from generalassemblies_data_final 

) 

select * 
from q1; 

아무도 여기 나 좀 도와 주실 래요 달성하기 위해 노력하고 무엇을 나에게 제공하지 않습니다.

답변

2
Select ColumnName 
     , ColumnValue 
FROM 
(
    --<-- Make sure all the columns are converted to the same data type here 
    -- This is the only purpose of this sub-query 
    Select CHANGE_NUMBER  
      ,ITEM_NUMBER   
      ,REV 
      ,BOM_ITEM 
      ,CAST(FIND_NUMBER AS VARCHAR(100)) AS FIND_NUMBER 
      ,CAST(QUANTITY AS VARCHAR(100)) AS QUANTITY 
    from TableName --<-- Your Table name here 
)t 
    UNPIVOT (ColumnValue for ColumnName 
      IN (CHANGE_NUMBER , ITEM_NUMBER , REV 
       ,BOM_ITEM , FIND_NUMBER , QUANTITY) 
      )UP 
+0

감사합니다. @ M.Ali. 제공된 솔루션이 제대로 작동했습니다. :) –

1

column_values가 모두 동일한 유형 (nvarchar?)으로 변환되면 UNION ALL의 목록이 작동합니다. 그 외에는 쿼리 결과를 소비 할 수있는 프로그램으로 처리되는 프레젠테이션 수준의 문제를 검토하는 것이 좋습니다.

모든 보고서 디자이너가 작동 할 수 있다고 생각합니다. 당신은 VB.NET으로 3GL 등으로이 일을 찾고 있다면, 당신은 당신의 행 기반 쿼리를 유지하고 형식의 데이터 쓰는 것 :

for each row in someresult 
    Console.WriteLine(string.format("Change Number" & vbtab & "{0}", row.ChangeNumber) 
    Console.WriteLine(string.format("Item Number" & vbtab & "{0}", row.ItemNumber) 
next 

내가 여기 당신에게 정확한 구문을 줄 수를 그러나 결과, 출력 스트림 및 서식의 일부 혼합이 작동합니다.

1

또한 이런 종류의 작업을 수행 할 APPLY 연산자를 사용할 수 있습니다

select Transposed.* 
from <TableName> 
cross apply (values 
    (CHANGE_NUMBER) 
    , (ITEM_NUMBER) 
    , (REV) 
    , (BOM_ITEM) 
    , (FIND_NUMBER) 
    , (QUANTITY) 
    , (CHANGE_NUMBER) 
    , (ITEM_NUMBER) 
    , (REV) 
    , (BOM_ITEM) 
    , (Cast(FIND_NUMBER as varchar(10))) 
    , (Cast(QUANTITY as varchar(10))) 
) as Transposed (ChangeNumber, ItemNumber, Revision, BomItem, FindNumber, Quantity); 

나는이 버전을 선호 이미 일반에 APPLY를 사용하여 쉽게 UNPIVOT보다 기억하기 찾을 수 있기 때문이다. 또한 필자는 PascalCase를 사용하여 구문을 강조 표시하기 위해 열을 별명을 지정했습니다. 자유롭게 원하는대로 변경할 수 있습니다.

+0

작동하지 않습니다. 쿼리가 실행되면 "키워드 근처에 구문이 잘못되었습니다"라는 오류 메시지가 표시됩니다. –

+0

@BurhanKhalidButt 죄송합니다, 괄호 두 개를 잊었습니다. – Kittoes0124

관련 문제