Sql 显示请求的计数结果,水平显示作业结果,垂直显示位置3个表
因此,我有一个主数据表,它保存作业和位置的ID,例如: 请求表dbo.Requests 作业表dbo.Jobs 位置表dbo.Locations 现在我要做的是显示已完成作业和位置的计数列表,如:Sql 显示请求的计数结果,水平显示作业结果,垂直显示位置3个表,sql,sql-server,join,Sql,Sql Server,Join,因此,我有一个主数据表,它保存作业和位置的ID,例如: 请求表dbo.Requests 作业表dbo.Jobs 位置表dbo.Locations 现在我要做的是显示已完成作业和位置的计数列表,如: Job Title Total Jobs Location 1 Location 2 Location 3 Job 1 30 5 15 10 Job 2 10
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
非常感谢您可以使用以下查询
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)
有多少个地点?只有3个?还是未知?未知,因为它们将被添加和删除。谢谢,谢谢,快到了,它列出了右边一个区域的所有计数,但是它将ID列为标题而不是位置名称?@slowlygettingthere-如果SQLServer版本支持,您也可以在DECLARE块中使用varcharMAX类型。@slowlygettingthere-我再次更新了我的答案。最后我不得不使用max,因为它没有发挥作用否则非常感谢。
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
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)