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

你在问什么似乎有点奇怪。如果我向你的榜样,包括列Feb1Feb2,那么,我认为从这个调换你的列中的两个选项:

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

回报:

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

你基本上只是增加另一列到输出。

我不建议使用数字作为列名,也不是SQL Server的关键字,如month

+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