0

Ich möchte Spalten in Zeilen in SQL Server konvertieren:Konvertieren Spalten in Zeilen und Spaltennamen in SQL Server

sollte
Id Value Jan1 Jan2 
---------------------- 
1  2  25 35 
2  5  45 45 

Ergebnis sein

Id Value Month 1 2 
---------------------- 
1 2  Jan 25 35 
2 5  Jan 45 45 

Wie kann ich dieses Ergebnis zu erhalten? Wer bitte

+0

Ihre Probe und gewünschte Ergebnisse sind ein wenig dünn. Sind diese Tage des Jahres oder Jahr über Jahre? Wird es mehrere Monate geben? –

Antwort

1

Was Sie fragen, scheint ein wenig seltsam. Wenn ich Ihr Beispiel erweitern, um Spalten für Feb1 und Feb2 sind, dann sehe ich zwei Optionen für die Spalten aus dieser Umsetzung:

+----+-------+------+------+------+------+ 
| Id | Value | Jan1 | Jan2 | Feb1 | feb2 | 
+----+-------+------+------+------+------+ 
| 1 |  2 | 25 | 35 | 15 | 28 | 
| 2 |  5 | 45 | 45 | 60 | 60 | 
+----+-------+------+------+------+------+ 

Transponierung nur der Monat Teil:

select Id, Value, MonthName, MonthValue1, MonthValue2 
from t 
    cross apply (values ('Jan',Jan1,Jan2),('Feb',Feb1,Feb2) 
    ) v (MonthName,MonthValue1,MonthValue2) 

kehrt:

+----+-------+-----------+-------------+-------------+ 
| Id | Value | MonthName | MonthValue1 | MonthValue2 | 
+----+-------+-----------+-------------+-------------+ 
| 1 |  2 | Jan  |   25 |   35 | 
| 1 |  2 | Feb  |   15 |   28 | 
| 2 |  5 | Jan  |   45 |   45 | 
| 2 |  5 | Feb  |   60 |   60 | 
+----+-------+-----------+-------------+-------------+ 

Oder die Monatsspalten komplett wie folgt transponieren:

select Id, Value, MonthName, MonthValue 
from t 
    cross apply (values ('Jan1',Jan1),('Jan2',Jan2),('Feb1',Feb1),('Feb2',Feb2) 
    ) v (MonthName,MonthValue) 

kehrt:

+----+-------+-----------+------------+ 
| Id | Value | MonthName | MonthValue | 
+----+-------+-----------+------------+ 
| 1 |  2 | Jan1  |   25 | 
| 1 |  2 | Jan2  |   35 | 
| 1 |  2 | Feb1  |   15 | 
| 1 |  2 | Feb2  |   28 | 
| 2 |  5 | Jan1  |   45 | 
| 2 |  5 | Jan2  |   45 | 
| 2 |  5 | Feb1  |   60 | 
| 2 |  5 | Feb2  |   60 | 
+----+-------+-----------+------------+ 

rextester Demo: http://rextester.com/KZV45690

1

helfen, dies zu sein scheinen würde:

select Id, Value, 'Jan' as [month], Jan1 as [1], Jan2 as [2] 
from t; 

Sie fügen im Grunde nur eine andere Spalte mit dem Ausgang.

Ich empfehle nicht, Zahlen als Spaltennamen oder SQL Server Schlüsselwörter wie month zu verwenden.

+0

, Monat Spalte ist nicht verfügbar. Monat Spalte aus SELECT-Klausel entfernen. – Mansoor

0

Hier ist eine Option, die Sie bis zu 365 Felder nicht angeben müssen

Declare @YourTable table (Id int,Value int,Jan1 int,Jan2 int,Feb1 int, Feb2 int) 
Insert Into @YourTable values 
(1,  2,  25, 35, 100, 101), 
(2,  5,  45, 45, 200, 201) 


Select [Id],[Value],[Month],[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31] 
From (
     Select A.Id 
       ,A.Value 
       ,[Month] = Left(C.Item,3) 
       ,[Col]  = substring(C.Item,4,5) 
       ,[Measure] = C.Value 
     From @YourTable A 
     Cross Apply (Select XMLData = cast((Select A.* for XML Raw) as xml)) B 
     Cross Apply (
         Select Item = attr.value('local-name(.)','varchar(100)') 
           ,Value = attr.value('.','int') 
         From B.XMLData.nodes('/row') as A(r) 
         Cross Apply A.r.nodes('./@*') AS B(attr) 
         Where attr.value('local-name(.)','varchar(100)') not in ('ID','Value') 
        ) C 
    ) A 
Pivot (sum(Measure) For [Col] in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31])) p 

Returns

enter image description here

Verwandte Themen