/ / Konvertiert Spalten in Zeilen und einen Spaltennamen in SQL Server - SQL, SQL-Server, SQL-Server-2008, SQL-Server-2012, SQL-Server-2008-R2

Konvertieren Sie Spalten in Zeilen und Spaltennamen in SQL Server - SQL, SQL-Server, SQL-Server-2008, SQL-Server-2012, SQL-Server-2008-R2

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 № 1

Was 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

Bildbeschreibung hier eingeben