显示请求的计数结果,横向显示作业结果,纵向显示位置 3 个表格
Posted
技术标签:
【中文标题】显示请求的计数结果,横向显示作业结果,纵向显示位置 3 个表格【英文标题】:Display count results of requests with results of jobs horizontally and locations vertically 3 tables 【发布时间】:2017-11-13 15:38:05 【问题描述】:所以我有一个主数据表,其中包含针对工作和位置的 ID,例如:
请求表 dbo.Requests
RequestID JobID LocationID
1 3 5
2 4 8
3 3 2
工作表 dbo.Jobs
JobID JobTitle
1 Job 1
2 Job 2
3 Job 3
位置表 dbo.Locations
LocationID LocationName
1 Location 1
2 Location 2
3 Location 3
现在我要做的是显示已完成工作和位置的计数列表,例如:
Job Title Total Jobs Location 1 Location 2 Location 3
Job 1 30 5 15 10
Job 2 10 2 2 6
Job 3 40 22 0 18
所以我的第一部分可以很好地显示工作和总数,但我无法将位置列出在右侧?
SELECT
job.JobTitle
,isnull(COUNT(req.JobID),0) AS 'Total Jobs'
FROM Requests req
RIGHT OUTER JOIN Jobs job
ON req.JobID = job.JobID
GROUP BY job.JobTitle
ORDER BY JobTitle
非常感谢
【问题讨论】:
有多少个地点?只有3个?还是未知? 未知,因为它们将被添加和删除。谢谢。 【参考方案1】:您可以使用以下查询
SELECT JobID,JobTitle,[1],[2],[3],[4],[5],[6],[7],[8]
FROM
(
SELECT j.JobID,j.JobTitle,r.LocationID,r.RequestID
FROM Jobs j
LEFT JOIN Requests r ON r.JobID=j.JobID
) q PIVOT(COUNT(RequestID) FOR LocationID IN([1],[2],[3],[4],[5],[6],[7],[8])) p
如果您想使用动态列数,您可以生成脚本并使用 EXEC 执行它
DECLARE @locationIDs varchar(200)=''
SELECT @locationIDs+=CONCAT(',[',LocationID,']')
FROM Locations
ORDER BY LocationID
SET @locationIDs=STUFF(@locationIDs,1,1,'')
--PRINT @locationIDs
DECLARE @query varchar(1000)=CONCAT('SELECT JobID,JobTitle,',@locationIDs,'
FROM
(
SELECT j.JobID,j.JobTitle,r.LocationID,r.RequestID
FROM Jobs j
LEFT JOIN Requests r ON r.JobID=j.JobID
) q PIVOT(COUNT(RequestID) FOR LocationID IN(',@locationIDs,')) p')
--PRINT @query
EXEC(@query)
带有位置标题的变体
DECLARE
@locationIDs varchar(200)='',
@locationTitles varchar(2000)=''
SELECT
@locationIDs+=CONCAT(',[',LocationID,']'),
@locationTitles+=CONCAT(',[',LocationID,'] [',LocationName,']')
FROM Locations
ORDER BY LocationID
SET @locationIDs=STUFF(@locationIDs,1,1,'')
SET @locationTitles=STUFF(@locationTitles,1,1,'')
--PRINT @locationIDs
--PRINT @locationTitles
DECLARE @query varchar(2000)=CONCAT('SELECT JobID,JobTitle,',@locationTitles,'
FROM
(
SELECT j.JobID,j.JobTitle,r.LocationID,r.RequestID
FROM Jobs j
LEFT JOIN Requests r ON r.JobID=j.JobID
) q PIVOT(COUNT(RequestID) FOR LocationID IN(',@locationIDs,')) p')
--PRINT @query
EXEC(@query)
【讨论】:
谢谢,这几乎就在那里,它列出了右侧病房的所有计数,但是它将 ID 列为标题而不是位置名称? @slowlygettingthere - 如果您的 SQLServer 版本支持,您也可以在 DECLARE 块中使用类型 varchar(MAX)。 @slowlygettingthere - 我又更新了一次答案。 最后我不得不使用 max,否则它不会打球。谢谢!以上是关于显示请求的计数结果,横向显示作业结果,纵向显示位置 3 个表格的主要内容,如果未能解决你的问题,请参考以下文章