Ich möchte Spalten in Zeilen in SQL Server konvertieren:
Id Value Jan1 Jan2
----------------------
1 2 25 35
2 5 45 45
Ergebnis sollte sein
Id Value Month 1 2
----------------------
1 2 Jan 25 35
2 5 Jan 45 45
Wie kann ich dieses Ergebnis erhalten? Bitte helfen Sie mir
Antworten:
1 für die Antwort № 1Was Sie fragen, scheint etwas seltsam zu sein. Wenn ich Ihr Beispiel erweitern möchte, um Spalten für Feb1
und Feb2
, dann sehe ich zwei Möglichkeiten, um deine Spalten davon zu transponieren:
+----+-------+------+------+------+------+
| Id | Value | Jan1 | Jan2 | Feb1 | feb2 |
+----+-------+------+------+------+------+
| 1 | 2 | 25 | 35 | 15 | 28 |
| 2 | 5 | 45 | 45 | 60 | 60 |
+----+-------+------+------+------+------+
Transponiere nur den Monatsteil:
select Id, Value, MonthName, MonthValue1, MonthValue2
from t
cross apply (values ("Jan",Jan1,Jan2),("Feb",Feb1,Feb2)
) v (MonthName,MonthValue1,MonthValue2)
kehrt zurück:
+----+-------+-----------+-------------+-------------+
| 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 zurück:
+----+-------+-----------+------------+
| 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 für die Antwort № 2
Dies scheint zu sein:
select Id, Value, "Jan" as [month], Jan1 as [1], Jan2 as [2]
from t;
Sie fügen im Grunde nur eine weitere Spalte zur Ausgabe hinzu.
Ich empfehle nicht, Zahlen als Spaltennamen oder SQL Server Schlüsselwörter wie month
.
0 für die Antwort № 3
Hier ist eine Option, dass Sie nicht bis zu 365 Felder 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
Kehrt zurück