2014-02-05 90 views
3

我有我創建的以下視圖看起來像這張表。需要SQL數據透視幫助,因爲我沒有聚合列

Create Table #Temptable(
[Week number] int, 
[Did Not meet minimum] int, 
[Met minimum] int, 
[exceeded minimum] int); 

insert into #Temptable([Week number],[Did Not meet minimum],[Met minimum],[exceeded minimum]) 
values 
(3,161,4,18), 
(4,165,1,24), 
(5,166,0,10) 

我想輸出爲三行,以便我可以按周創建趨勢報告。我可以填充臨時表來獲得所需的結果,但我想看看是否有更好的解決方案。

Label, week3, week4, week5 
Did not meet minimum, 161, 165, 166 
Met minimum, 4, 1, 0 
Exceeded minimum, 18, 24, 10 

如果這從這個數據集是不可能的,我也有源代碼行項目詳細信息的視圖是從創建。該數據集看起來像這樣

techname,machinename,installdate,weeknumber 

我提出,通過techname和週數合計3個標量函數,這樣我可以讓沒有滿足,滿足,並超過了每星期的安裝次數。

預先感謝您。

從StuartLC得到迴應後,我開始製作我自己的動態版本我很接近,但是當我發佈一個回覆時,另一個人發佈了一個工作版本。爲了大家的利益,這裏是我把它放在一起的示例代碼,但不起作用。如果我複製錯誤文本並只選擇輸出的查詢,它可以正常工作。

DECLARE @cols AS NVARCHAR(MAX), 
@query AS NVARCHAR(MAX) 
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.[week number]) 
     FROM SummarisedWeeklysums c 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 

set @query = 'SELECT Criteria, '+ @Cols +' FROM 
(
SELECT 
    * 
FROM 
    SummarisedWeeklysums 
UNPIVOT 
(
    CriteriaCount 
    for Criteria in ([Did Not meet minimum],[Met minimum],[exceeded minimum]) 
) unpvt 
) X 
    PIVOT 
    (
SUM(CriteriaCount) 
for [Week Number] IN ('[email protected]+') 
)pvt' 

execute @query 

回答

1

的是基於StuartLC答案和鏈接(信用給你)的可擴展性,如果額外幾周在將來添加:

DECLARE @cols AS NVARCHAR(MAX); 
DECLARE @query AS NVARCHAR(MAX); 
select @cols = STUFF((SELECT distinct ',' + 
         QUOTENAME('Week'+cast([Week Number] as varchar)) 
         FROM #Temptable 
         FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
         , 1, 1, ''); 
select @query = 
'SELECT * 
FROM 
(
    SELECT 
      ''Week''+cast([Week number] as varchar) as [Week number] , CriteriaCount , Criteria 
    FROM 
     #Temptable 
    UNPIVOT 
    (
     CriteriaCount 
     for Criteria in ([Did Not meet minimum],[Met minimum],[exceeded minimum]) 
    ) unpvt 
) X 
PIVOT 
(
SUM(CriteriaCount) 
for [Week Number] in (' + @cols + ') 
)pvt ;'; 
execute(@query); 

下面是相同的代碼,用結果移動到一個臨時表(按照user3275​​636的要求),然後顯示:

DECLARE @cols AS NVARCHAR(MAX); 
DECLARE @query AS NVARCHAR(MAX); 
select @cols = STUFF((SELECT distinct ',' + 
         QUOTENAME('Week'+cast([Week Number] as varchar)) 
         FROM #Temptable 
         FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
         , 1, 1, ''); 
select @query = 
'select * into ##temp1 from (SELECT * 
FROM 
(
    SELECT 
      ''Week''+cast([Week number] as varchar) as [Week number] , CriteriaCount , Criteria 
    FROM 
     #Temptable 
    UNPIVOT 
    (
     CriteriaCount 
     for Criteria in ([Did Not meet minimum],[Met minimum],[exceeded minimum]) 
    ) unpvt 
) X 
PIVOT 
(
SUM(CriteriaCount) 
for [Week Number] in (' + @cols + ') 
)pvt) as combi;'; 
execute(@query); 
select * from ##temp1; 
+0

非常感謝您根據StuartLC發送的鏈接自行開展工作。這是我得到它沒有正常運行但是,如果我選擇了錯誤,並刪除了錯誤的消息信息它正常運行。 – user3275636

+0

什麼是最好的方式把它放到視圖或臨時表中我可以從畫面查詢。 – user3275636

+0

@ user3275​​636選擇添加到臨時表版本 – MKC

2

這非常類似於我answer here - 基本上你正在尋找一個完整的轉置。這可以用一個逆透視來完成,然後通過樞軸:

SELECT Criteria, [3] as Week3, [4] AS Week4, [5] AS Week5 
FROM 
(
    SELECT 
     * 
    FROM 
     #Temptable 
    UNPIVOT 
    (
     CriteriaCount 
     for Criteria in ([Did Not meet minimum],[Met minimum],[exceeded minimum]) 
    ) unpvt 
) X 
PIVOT 
(
SUM(CriteriaCount) 
for [Week Number] IN ([3],[4],[5]) 
)pvt; 

Fiddle here

另外,如果你需要爲一羣不明星期做這個(或標準,我猜的),你可以看看在answer here它使用動態sql來建立列和執行樞紐。

+0

哇..非常感謝。我真的不知道如何使用我的數據集對pivot命令進行語法分析。感謝AHHA的時刻。 – user3275636