2014-02-18 2 views
0

나는 다음과 같은 데이터가 있습니다SQL Server의 일부 컬럼에 행을 변환

RecordYear TestA TestB TestC TestD 
2013  100 200 300 400 
2014  150 250 350 450 

내가 표시 할 : 내가 거기에 일부 길을 얻을 수 UNPIVOT을 사용했습니다

2013 TestType Result 2014 Test Result 
    TestA  100   TestA 150 
    TestB  200   TestB 250 
    TestC  300   TestC 350 
    TestD  400   TestD 450 

,하지만 내 쿼리를 다음과 같이 끝납니다 :

2013 
TestA 100 
TestB 200 
TestC 300 
TestD 400 

2014 
TestA 150 
TestB 250 
TestC 350 
TestD 450 

2014 그룹화를 이동하여 2013 그룹 옆에 배치하는 방법을 모르겠습니다. 어떤 도움이라도 대단히 감사 할 것입니다. 이 피벗 다음 자체에 합류 시험 유형에 할 수있는 CTE를 사용하여 원하는 결과를 생성합니다

+0

당신은 아마 아주 가깝습니다. 샘플 데이터를로드하는 스크립트 (또는 http://sqlfiddle.com/#!6)와 쿼리를 제공하는 시간을 가져주십시오. –

답변

0

감사합니다,

WITH pv 
    AS (SELECT recordyear, 
       col, 
       val 
     FROM table1 p 
       UNPIVOT (val 
         FOR col IN (testa, 
            testb, 
            testc, 
            testd)) AS unpvt) 
SELECT a.col [2013 TestType], 
     a.val [ Result ], 
     b.col [2014 TestType], 
     b.val [ Result] 
FROM pv a 
     INNER JOIN pv b 
       ON a.col = b.col 
WHERE a.recordyear = 2013 
     AND b.recordyear = 2014 

DEMO

는 한계가 있습니다 그러나

  • 테스트 결과가 다를 경우 외부 조
  • 는 열 이름은
0

당신은 단순히 UNION을 복용하여이 작업을 수행 할 단지 이드 유지할 수 있습니다 곳을 일치하도록 하드 코딩되어

  • 일년 이상 원하는 경우 잘 작동하지 않습니다 1 가입을위한 매년 결과 집합에 대해 4 그것의 간단한

    ;WITH CTE1 AS 
        (
         SELECT 1 ID, RecordYear,'TESTA' TESTTYPE,TESTA Result FROM #TABLE WHERE RecordYear=2013 
         UNION ALL 
         SELECT 2 ID,RecordYear,'TESTB' TESTTYPE,TESTB Result FROM #TABLE WHERE RecordYear=2013 
         UNION ALL 
         SELECT 3 ID,RecordYear,'TESTC' TESTTYPE,TESTC Result FROM #TABLE WHERE RecordYear=2013 
         UNION ALL 
         SELECT 4 ID,RecordYear,'TESTD' TESTTYPE,TESTD Result FROM #TABLE WHERE RecordYear=2013 
        ) 
        ,CTE2 AS 
        (
         SELECT 1 ID,RecordYear,'TESTA' TEST,TESTA Result FROM #TABLE WHERE RecordYear=2014 
         UNION ALL 
         SELECT 2 ID,RecordYear,'TESTB' TEST,TESTB Result FROM #TABLE WHERE RecordYear=2014 
         UNION ALL 
         SELECT 3 ID,RecordYear,'TESTC' TEST,TESTC Result FROM #TABLE WHERE RecordYear=2014 
         UNION ALL 
         SELECT 4 ID,RecordYear,'TESTD' TEST,TESTD Result FROM #TABLE WHERE RecordYear=2014 
        ) 
        SELECT NULL '2013' ,CTE1.TESTTYPE,CTE1.Result,NULL '2014',CTE2.TEST,CTE2.Result 
        FROM CTE1 
        JOIN CTE2 ON CTE1.ID=CTE2.ID