我试图在视图上转置列和行,但行是每周更改的日期,我似乎无法正常运行。
我所拥有的是以下内容;
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;
答案 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
<强>返回强>