2016-12-01 7 views
0

Mit Daten in Below Format: -Convert SQL-Daten in einem Format in ein anderes

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 

Will ich haben in diesem Format konvertieren: -

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 

wie kann ich diesen Ansatz Aufgabe?

Vielen Dank im Voraus.

+2

Suche nach * T-SQL-Pivot * oder * T-SQL-dynamische Pivot * wenn die Anzahl der Valley-Werte sind variabel. –

+0

Versuchen Sie auch nicht, Ihre Daten auf diese Weise zu formatieren, wenn Sie sie an eine Front-End-Reporting/Dashboard-Anwendung liefern, die dies für Sie mit zusätzlichen Funktionen tun kann, die sehr hilfreich sind. – iamdave

+0

Bitte werfen Sie einen Blick auf [how-to-ask] (http://stackoverflow.com/help/how-to-ask) – swe

Antwort

1

Dies ist schwierig, weil Sie keine Spalte zum Drehen haben. Ein Verfahren verwendet row_number() und bedingte Aggregation:

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

Sie können es tun, wie diese mit Dreh:

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; 
Verwandte Themen