SQL Serverで行と列名に列を変換します私はSQL Serverで行に列を変換したい
Id Value Jan1 Jan2
----------------------
1 2 25 35
2 5 45 45
結果が
Id Value Month 1 2
----------------------
1 2 Jan 25 35
2 5 Jan 45 45
する必要がありますどのように私はこの結果を得ることができますか?誰でも
SQL Serverで行と列名に列を変換します私はSQL Serverで行に列を変換したい
Id Value Jan1 Jan2
----------------------
1 2 25 35
2 5 45 45
結果が
Id Value Month 1 2
----------------------
1 2 Jan 25 35
2 5 Jan 45 45
する必要がありますどのように私はこの結果を得ることができますか?誰でも
あなたが求めていることはちょっと変わったようです。
+----+-------+------+------+------+------+
| Id | Value | Jan1 | Jan2 | Feb1 | feb2 |
+----+-------+------+------+------+------+
| 1 | 2 | 25 | 35 | 15 | 28 |
| 2 | 5 | 45 | 45 | 60 | 60 |
+----+-------+------+------+------+------+
トランスポーズだけで月の部分:
select Id, Value, MonthName, MonthValue1, MonthValue2
from t
cross apply (values ('Jan',Jan1,Jan2),('Feb',Feb1,Feb2)
) v (MonthName,MonthValue1,MonthValue2)
リターン:
私はFeb1
と
Feb2
の列を含めるようにあなたの例を拡張した場合、私はこのことから、あなたの列を転置するための2つのオプションを参照してください
+----+-------+-----------+-------------+-------------+
| 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 |
+----+-------+-----------+-------------+-------------+
月の列を次のように完全に転記します。
のselect Id, Value, MonthName, MonthValue
from t
cross apply (values ('Jan1',Jan1),('Jan2',Jan2),('Feb1',Feb1),('Feb2',Feb2)
) v (MonthName,MonthValue)
リターン:
+----+-------+-----------+------------+
| 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デモ:http://rextester.com/KZV45690
を助けてくださいこれがあるように思われる:
select Id, Value, 'Jan' as [month], Jan1 as [1], Jan2 as [2]
from t;
あなたは基本的には、出力に別の列を追加しています。
数値を列名として使用したり、month
などのSQL Serverキーワードを使用しないことをお勧めします。
、月の列は使用できません。SELECT句の月の列を削除します。 – Mansoor
ここでは、あなたが365のフィールドに
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
戻り
を指定する必要はありませんオプションです。
あなたのサンプルと希望の結果は少し薄いです。これらの日は今年ですか、何歳ですか?複数の月がありますか? –