SQL将列转置为具有波动行的行

时间:2017-07-13 12:53:04

标签: sql sql-server tsql transpose

我试图在视图上转置列和行,但行是每周更改的日期,我似乎无法正常运行。

我所拥有的是以下内容;

Date       | Report1 | Report2 |
---------- | ------- | ------- | 
2017-07-01 | N/A     | Yes     |
2017-07-02 | Yes     | Yes     |
2017-07-03 | N/A     | Yes     |
2017-07-04 | Yes     | Yes     |
2017-07-05 | N/A     | Yes     |
2017-07-06 | NULL    | NULL    |
2017-07-07 | N/A     | N/A     |

我希望它看起来像是什么;

Date     | 2017-07-01 | 2017-07-02 | 2017-07-03 | 2017-07-04 | 2017-07-05 | 2017-07-06 | 2017-07-07 |
-------- | ---------- | ---------- | ---------- | ---------- | ---------- | ---------- | ---------- |
Report1  | N/A        | Yes        | N/A        | Yes        | N/A        | Null       | N/A        |
Report2  | Yes        | Yes        | Yes        | Yes        | Yes        | Null       | N/A        |

唯一的问题是日期正在滚动,因此列名称将会更改。 *还有更多的报道,但为简单起见,2就足够了#34;

2 个答案:

答案 0 :(得分:0)

你实际上需要UNPIVOT和Dynamic PIVOT的组合

input

答案 1 :(得分:0)

以下内容将动态取消您的数据,然后创建/执行动态数据透视。

使用动态UNPIVOT,无需指定字段(或“报告”)

此外,使用日期参数( @ Date1和@ Date2 ),您可以指定要转动的所需日期范围

示例

Declare @Date1 varchar(10) = '2017-07-01'
Declare @Date2 varchar(10) = '2017-07-07'

Declare @SQL varchar(max) = '
Declare @XML xml = (Select * from YourTable Where Date Between '''+@Date1+''' and '''+@Date2+''' for XML RAW)

Select *
 From (
        Select Date   = r.value(''@Date'',''Date'')
              ,Item   = attr.value(''local-name(.)'',''varchar(100)'')
              ,Value  = attr.value(''.'',''varchar(max)'') 
         From  @XML.nodes(''/row'') as A(r)
         Cross Apply A.r.nodes(''./@*'') AS B(attr)
         Where attr.value(''local-name(.)'',''varchar(100)'') not in (''Date'')
      ) A
 Pivot (max([Value]) For [Date] in (' + Stuff((Select Distinct ','+QuoteName(Date) 
                                               From  YourTable
                                               Where Date Between @Date1 and @Date2
                                               Order By 1 
                                               For XML Path('')),1,1,'')  + ') ) p'
Exec(@SQL);
--Print @SQL

<强>返回

enter image description here