0

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 

する必要がありますどのように私はこの結果を得ることができますか?誰でも

+0

あなたのサンプルと希望の結果は少し薄いです。これらの日は今年ですか、何歳ですか?複数の月がありますか? –

答えて

1

あなたが求めていることはちょっと変わったようです。

+----+-------+------+------+------+------+ 
| 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) 

リターン:

私は Feb1Feb2の列を含めるようにあなたの例を拡張した場合、私はこのことから、あなたの列を転置するための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

1

を助けてくださいこれがあるように思われる:

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

あなたは基本的には、出力に別の列を追加しています。

数値を列名として使用したり、monthなどのSQL Serverキーワードを使用しないことをお勧めします。

+0

、月の列は使用できません。SELECT句の月の列を削除します。 – Mansoor

0

ここでは、あなたが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 

戻り

を指定する必要はありませんオプションです。

enter image description here

関連する問題