2014-02-18 2 views
0

У меня есть следующие данные:преобразования строк в некоторых столбцов в SQL-сервере

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

Я хочу, чтобы отобразить:

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

Я использовал UNPIVOT, чтобы получить часть пути там, но мой запрос заканчивается:

2013 
TestA 100 
TestB 200 
TestC 300 
TestD 400 

2014 
TestA 150 
TestB 250 
TestC 350 
TestD 450 

Я не знаю, как двигаться в 2014 году группировку так, что рядом с группой 2013 года. Любая помощь будет очень признательна.

Спасибо,

+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

Однако он имеет ограничения

  • Если проведенные испытания различны, вы можете захотеть наружного jo в
  • не будет хорошо работать, если вы хотите больше, чем один год
  • Имена столбцов жёстко, чтобы соответствовать где
0

Вы можете просто сделать это, беря UNION и просто держать Id 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 
Смежные вопросы