Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL数据透视查询_Sql_Pivot - Fatal编程技术网

SQL数据透视查询

SQL数据透视查询,sql,pivot,Sql,Pivot,我试图做一个透视,但是我使用的查询组合了几个表来提供我需要的结果。我的问题是: 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 IN

我试图做一个透视,但是我使用的查询组合了几个表来提供我需要的结果。我的问题是:

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示例,但我发现的大多数都不能满足我的需要。 我不需要做这个转换,但是我正试图让它尽可能对用户友好


提前感谢。

在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

在我的小脑袋里,这是将初始结果放入#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

是否有固定数量或队列?您的rdbms是什么?你需要一个动态的支点。但是每个数据库都有一个不同的aproach。@McNets你不需要删除,也许他不知道如何做一个基本的支点,帮助他开始做一些事情。但是我认为他需要一个动态的pivot op说:
如果可能的话,我希望使标题是动态的,因为队列名称会根据运行报表的人而变化
最好不要在多个地方更改笨拙的
where
语句。@SqlZim我的想法正是如此。。。有时候懒散是可以的,让我们称之为创新、高效和/或简洁。