我正在尝试使用数据透视表,但我正在使用的查询结合了几个表来提供我需要的结果。这是我的疑问:
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列作为列标题,使用Entry日期作为Row标题。所以它看起来像这样:
EntryDate Queue1 Queue2 Queue3
-----------------------------------------------
01/01/2017 15 4 54
01/04/2017 9 null null
01/21/2017 27 12 null
涉及到很多队列和入口日期,如果可能的话,我想使标头动态化,因为队列名称会根据运行报告的人而改变。 我知道有很多Pivot示例,但我发现的大部分内容并不能完全满足我的需求。 我不需要进行此转换,但我正在努力使用户尽可能方便用户。
提前致谢。
答案 0 :(得分: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
答案 1 :(得分: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