2017-03-10 161 views
1

我正在嘗試做一個數據透視表,但是我正在使用的查詢結合了幾個表格來提供我需要的結果。這裏是我的查詢:SQL樞軸查詢

Select lc.statename as 'Queue', 
     CONVERT(varchar(10), wfl.entrytime, 110) as 'EntryDate', 
     count(lc.statenum) as 'Count' -- CONVERT(varchar(10), wfl.entrytime, 110) as 'EntryDate' 
FROM lcstate lc 
INNER JOIN wflog wfl ON lc.statenum = wfl.statenum 
INNER JOIN lifecycle lif ON wfl.lcnum = lif.lcnum 
INNER JOIN itemdata id ON wfl.itemnum = id.itemnum 

WHERE (lif.lcnum = '163') 
    AND (lc.statenum IN ('836', '837', '848', '863', '845', '859', '860', '864', '865', '866', '816', '867', '869', '868', '870', '872')) 
    AND wfl.exittime = '1964-01-01 00:00:00.000' 
GROUP BY lc.statename, CONVERT(varchar(10), wfl.entrytime, 110) 
Order by 1,2,3 desc 

我的結果如下:

Queue   Entry Date   Count 
---------------------------------------------------------------- 
Queue1   01/01/2017    15 
Queue1   01/04/2017    9 
Queue1   01/21/2017    27 
Queue2   01/01/2017    4 
Queue2   01/21/2017    12 
Queue3   01/01/2017    54 

而且我想用第1列的列標題和輸入日期作爲行頭。所以它看起來是這樣的:

EntryDate  Queue1  Queue2  Queue3 
----------------------------------------------- 
01/01/2017   15   4   54 
01/04/2017   9  null  null  
01/21/2017   27   12  null 

有很多涉及隊列和入境日期,我想使頭動態,如果可能的,因爲隊列名稱取決於誰在運行報表而改變。 我知道有很多Pivot的例子,但是我發現的大多數並不完全符合我的需求。 我不需要做這種轉換,但是我試圖使用戶對用戶友好。

在此先感謝。

+0

是有一個固定數量或隊列? – McNets

+0

你的rdbms是什麼?你需要一個動態的支點。但是每個db都有不同的說法。 –

+0

@McNets你不需要刪除,也許他不知道如何做到這一點基本的關鍵,並幫助他有一些東西開始。但我認爲他需要一個動態的數據透視表http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query –

回答

1

在SQL Server上,如果有衆所周知的列數,可以使用此語法。

SELECT Entry, [Queue1], [Queue2], [Queue3] 
FROM 
(SELECT Entry, Queue, Num 
    FROM @Piv) AS SourceTable 
PIVOT 
(
SUM(Num) 
FOR Queue IN ([Queue1], [Queue2], [Queue3]) 
) AS PivotTable; 

|Entry    |Queue1|Queue2|Queue3| 
|:------------------|-----:|-----:|-----:| 
|01/01/2017 00:00:00| 15|  4| 54| 
|04/01/2017 00:00:00|  9|  |  | 
|21/01/2017 00:00:00| 27| 12|  | 

dbfiddle here

+0

op說:「我想在隊列名稱改變時儘可能使標題動態化取決於誰在運行報告' –

1

在我的小腦袋,砸你的初步結果爲#TempResults表,然後運行一些動態SQL的最簡單方法。

-- Your Complicated Query into #TempResults 

Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName(Queue) From #TempResults Order by 1 For XML Path('')),1,1,'') 
Select @SQL = ' 
Select * 
From #TempResults 
Pivot (sum(count) For [Queue] in (' + @SQL + ')) p' 
Exec(@SQL); 

返回

Entry Date Queue1 Queue2 Queue3 
2017-01-01 15  4  54 
2017-01-04 9  NULL NULL 
2017-01-21 27  12  NULL 
+0

很好,不用在不止一個地方改變那些笨拙的'where語句。 – SqlZim

+0

@SqlZim我的想法......有時候可以懶惰 –

+0

噓,讓我們把它稱爲創新,高效和/或簡潔。 – SqlZim