2016-12-01 11 views
0

Имея данные ниже в формате: -Преобразование данных SQL в одного формата в другой

valleyname value 

Valley 1 0 
Valley 1 22 

Valley 1 74 

Valley 1 116 
Valley 1 0 
Valley 1 182 
Valley 1 184 
Valley 2 30 
Valley 3 30 
Valley 4 80 
Valley 5 60 

Хотите, чтобы преобразовать его в этот формат: -

Valley 1  Valley 2 Valley 3 Valley 4 Valley 5 

22     30  30   80  60 

74     NULL  NULL  NULL  NULL 

116    NULL  NULL  NULL  NULL 

182    NULL  NULL  NULL  NULL 

184    NULL  NULL  NULL  NULL 

как я могу подойти к этому задача?

Заранее спасибо.

+2

Поиск * T-SQL поворота * или * T-SQL динамического поворота * если число Значения долины являются переменными. –

+0

Кроме того, не пытайтесь форматировать данные таким образом, если вы доставляете его в приложение для создания отчетов/панели мониторинга, которое сможет сделать это для вас с дополнительными функциями, которые будут очень полезными. – iamdave

+0

, пожалуйста, ознакомьтесь с [how-by-ask] (http://stackoverflow.com/help/how-to-ask) – swe

ответ

1

Это сложно, потому что у вас нет столбца для поворота. Один метод использует row_number() и условное агрегацию:

select max(case when valeyname = 'Valley 1' then value end) as valley_1, 
     max(case when valeyname = 'Valley 2' then value end) as valley_2, 
     max(case when valeyname = 'Valley 3' then value end) as valley_3, 
     max(case when valeyname = 'Valley 4' then value end) as valley_4, 
     max(case when valeyname = 'Valley 5' then value end) as valley_5  
from (select t.*, 
      row_number() over (partition by valleyname order by valleyname) as seqnum 
     from t 
    ) t 
group by seqnum; 
1

Вы можете сделать это, как это с шарниром:

DECLARE @valleys TABLE 
    (
     [valleyname] VARCHAR(20) , 
     [value] INT 
    ); 
INSERT INTO @valleys 
     (valleyname, value) 
VALUES ('Valley 1', 0), 
     ('Valley 1', 22), 
     ('Valley 1', 74), 
     ('Valley 1', 116), 
     ('Valley 1', 0), 
     ('Valley 1', 182), 
     ('Valley 1', 184), 
     ('Valley 2', 30), 
     ('Valley 3', 30), 
     ('Valley 4', 80), 
     ('Valley 5', 60); 

WITH vset (valleyname, vnum, [value]) 
      AS (SELECT valleyname , 
         ROW_NUMBER() OVER (PARTITION BY valleyname ORDER BY valleyname) , 
         [value] value 
       FROM  @valleys 
       WHERE [value] <> 0 
      ) 
    SELECT * 
    FROM vset PIVOT (MAX([value]) FOR vnum IN ([1], [2], [3], [4], [5])) pvt; 
Смежные вопросы