2016-12-01 93 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

请看[如何问](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;