如何将列标题转换为行而不将行移动到列

时间:2017-03-30 10:39:23

标签: sql sql-server transpose

我不确定我的问题是否正确。我正在使用sql server 2014管理工作室。

我有这张桌子:

|------------------|--01/12/2016--|--02/12/2016--|--03/12/2016--|--04/12/2016--|<br>
 |----Place------|--Count--Value|   Count   --Value|    Count--     Value|--    Count--value<br> 
|--London------|    random data--|random data--|-------------------|--------------------|                       
|--Manchester|-------------------|------------------|random data---|---------------------|                          
|--Birmingham|--------------------|---etc------------|etc----------------|-etc------------------|                           
|--Leeds--------|                           
|--Luton---------|                          
|--Scotland-----|   

我想要做的是将日期从列标题转换为行,所以它看起来像这样:

Place   ----------|---dates------|  Count--------|  Value<br>
London  --------|01/12/2016     
Manchester  --|01/12/2016       
Birmingham  --|01/12/2016       
Leeds   ---------|01/12/2016        
Luton   ----------|01/12/2016       
Scotland    ------|01/12/2016       
London--------  |02/12/2016     
Manchester--    |02/12/2016     
Birmingham--    |02/12/2016     
Leeds   ---------|02/12/2016        
Luton   ----------|02/12/2016       
Scotland------  |02/12/2016     
London  --------|03/12/2016     
Manchester  --|03/12/2016       
Birmingham  --|03/12/2016       
Leeds   ----------|03/12/2016       
Luton   -----------|03/12/2016      
Scotland    -------|03/12/2016      
London  ---------|04/12/2016        
Manchester  ---|04/12/2016      
Birmingham  ---|04/12/2016      
Leeds   ----------|04/12/2016       
Luton-----------    |04/12/2016     
Scotland    -------|04/12/2016

我搜索过移调数据,但似乎没有人覆盖这种情况。

2 个答案:

答案 0 :(得分:0)

您希望取消数据。我认为cross apply是最简单的方法:

select v.*
from t cross apply
     (values (city, cast('2016-01-12' as date), [01/12/2016]),
             (city, cast('2016-02-12' as date), [02/12/2016]),
             (city, cast('2016-03-12' as date), [03/12/2016]),
             . . .
     ) v(city, dte, cnt);

请注意,这会使第二列成为真正的日期。

答案 1 :(得分:0)

您可以通过R中名为“ reshape”的库获得所需的输出

简单的代码:

reshape::melt(DF,id="Place")

如果还有其他任何依赖列(如place),则可以遵循此代码。

reshape::melt(DF,id=c("Place","Type"))

参考链接为:https://www.r-statistics.com/tag/transpose/