2017-07-13 25 views
2

我試圖轉置視圖上的列和行,但行是日期每週更改,我似乎無法正常工作。SQL 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就足夠了」

+1

閱讀關於樞弟兄 – starko

+1

我會建議你要麼處理這顯示層(例如SSRS矩陣)或爲[動態sql方法]創建過程(https://stackoverflow.com/questions/1040 4348/sql-server-dynamic-pivot-query) – JohnHC

+0

我已經使用動態SQL和數據透視表完成了這項工作。編寫查詢以生成最近7天的日期,然後將該查詢用作樞軸列表。 –

回答

0

下面將動態逆透視數據,然後創建/執行動態支點。

使用動態UNPIVOT,有沒有需要

而且指定字段(或「報告」),與日期參數(@日期1和@日期2),您可以指定所需的日期範圍內轉動

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 '''[email protected]+''' and '''[email protected]+''' 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

0

你確實需要UNPIVOT的組合和動態PIVOT

IF (OBJECT_ID('tempdb..#unpvt') IS NOT NULL) DROP TABLE #unpvt; 
SELECT Report, Val, [Date] 
INTO #unpvt 
FROM 
(
    SELECT [Date], [Report1], [Report2] 
    FROM YourTable 
) p 
UNPIVOT 
    (Val FOR Report IN ([Report1], [Report2]) 
)AS unpvt; 


DECLARE @cols AS NVARCHAR(MAX); 
DECLARE @sql AS NVARCHAR(MAX); 

SET @cols = STUFF((SELECT distinct ', ' + QUOTENAME([Date]) 
        FROM YourTable c 
        FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,2,''); 

SET @sql = 'SELECT Report, ' + @cols + ' FROM 
      (
       SELECT * FROM #unpvt 
      ) x 
      PIVOT 
      (
       MAX(Val) 
       FOR [Date] in (' + @cols + ') 
      ) p '; 


EXECUTE(@sql); 
+0

完美!謝謝!! –