在SQL Server中将结果集动态选择为多行
我有SQL Server数据,其中包含可用和已分配的信息,我需要显示报告,如可用数据、已分配数据和每个资源的平衡数据 现在我有单行的所有信息,需要计算余额数据。如何检索预期的数据 当前数据和输出在SQL Server中将结果集动态选择为多行,sql,sql-server,pivot,common-table-expression,unpivot,Sql,Sql Server,Pivot,Common Table Expression,Unpivot,我有SQL Server数据,其中包含可用和已分配的信息,我需要显示报告,如可用数据、已分配数据和每个资源的平衡数据 现在我有单行的所有信息,需要计算余额数据。如何检索预期的数据 当前数据和输出 +--------------+---------------------+-------------+-----------+------------+------------+-----------+-----------+ | ResourceName | iGPMResourceGroupId
+--------------+---------------------+-------------+-----------+------------+------------+-----------+-----------+
| ResourceName | iGPMResourceGroupId | ProjectName | StaffedId | Capacity01 | Capacity02 | Staffed01 | Staffed02 |
+--------------+---------------------+-------------+-----------+------------+------------+-----------+-----------+
| Sakathi | 1020687 | Project 1 | 1 | 1 | 1 | 0 | 0 |
| Sakathi | 1020687 | Project 2 | (null) | 1 | 1 | (null) | (null) |
| Sakathi | 1020687 | Project 3 | 2 | 1 | 1 | 0 | 0 |
| Ravi | 1025136 | Project 2 | 3 | 0 | 0 | 1 | 1 |
| Palanisamy | 1025135 | Project 2 | (null) | 1 | 1 | (null) | (null) |
| Palanisamy | 1025135 | Project 3 | (null) | 1 | 1 | (null) | (null) |
| Manikumar | 1025164 | Project 2 | (null) | 1 | 1 | (null) | (null) |
| Manikumar | 1025164 | Project 3 | (null) | 1 | 1 | (null) | (null) |
+--------------+---------------------+-------------+-----------+------------+------------+-----------+-----------+
可用
+---+-------------+------------+---------------------+---------+------------+------------+
| Id| ResourceName| EmployeeId | iGPMResourceGroupId | GroupId | Capacity01 | Capacity02 |
+---+-------------+------------+---------------------+---------+------------+------------+
| 1 | Palanisamy | 24 | 1025135 | 15 | 0.70 | 0.70 |
| 2 | Anil | 20 | 1018707 | 15 | 1.00 | 1.00 |
| 3 | Ravi | 18 | 1025136 | 15 | 0.50 | 0.50 |
| 4 | Manikumar | 9 | 1025164 | 29 | 1.00 | 1.00 |
| 5 | Sakathi | 11 | 1020687 | 29 | 1.00 | 1.00 |
+---+-------------+------------+---------------------+---------+------------+------------+
需求
+------------+-------------+---------------------+
| Number | ProjectName | iGPMResourceGroupId |
+------------+-------------+---------------------+
| BM-00000001| Project 1 | 1020687 |
| BM-00000002| Project 2 | 1020687 |
| BM-00000002| Project 2 | 1025136 |
| BM-00000003| Project 3 | 1025164 |
| BM-00000002| Project 2 | 1025135 |
| BM-00000003| Project 3 | 1025135 |
| BM-00000003| Project 3 | 1020687 |
| BM-00000002| Project 2 | 1025164 |
+------------+-------------+---------------------+
+----+---------------------+----------------+------------+---------------------+------------+-----------+-----------+
| Id | AvailableResourceId | AssociateName | EmployeeId | iGPMResourceGroupId | ProjectId | Staffed01 | Staffed02 |
+----+---------------------+----------------+------------+---------------------+------------+-----------+-----------+
| 1 | 5 | Sakathi | 11 | 1020687 | BM-00000001| 0.30 | 0.30 |
| 2 | 5 | Sakathi | 11 | 1020687 | BM-00000003| 0.30 | 0.30 |
| 3 | 3 | Ravi | 18 | 1025136 | BM-00000002| 0.50 | 0.50 |
+----+---------------------+----------------+------------+---------------------+------------+-----------+-----------+
已分配
+------------+-------------+---------------------+
| Number | ProjectName | iGPMResourceGroupId |
+------------+-------------+---------------------+
| BM-00000001| Project 1 | 1020687 |
| BM-00000002| Project 2 | 1020687 |
| BM-00000002| Project 2 | 1025136 |
| BM-00000003| Project 3 | 1025164 |
| BM-00000002| Project 2 | 1025135 |
| BM-00000003| Project 3 | 1025135 |
| BM-00000003| Project 3 | 1020687 |
| BM-00000002| Project 2 | 1025164 |
+------------+-------------+---------------------+
+----+---------------------+----------------+------------+---------------------+------------+-----------+-----------+
| Id | AvailableResourceId | AssociateName | EmployeeId | iGPMResourceGroupId | ProjectId | Staffed01 | Staffed02 |
+----+---------------------+----------------+------------+---------------------+------------+-----------+-----------+
| 1 | 5 | Sakathi | 11 | 1020687 | BM-00000001| 0.30 | 0.30 |
| 2 | 5 | Sakathi | 11 | 1020687 | BM-00000003| 0.30 | 0.30 |
| 3 | 3 | Ravi | 18 | 1025136 | BM-00000002| 0.50 | 0.50 |
+----+---------------------+----------------+------------+---------------------+------------+-----------+-----------+
查询
SELECT ResourceName, iGPMResourceGroupId, ProjectName, StaffedId, Capacity01, Capacity02, Staffed01, Staffed02
FROM
(
SELECT Distinct A. ResourceName, A.EmployeeId, A.[iGPMResourceGroupId], D.[ProjectName], S.[Id] AS StaffedId, A.[Capacity01], A.[Capacity02], S.[Staffed01], S.[Staffed02]
FROM [AvailableR] A JOIN [DemandR] D ON A.[iGPMResourceGroupId] = D.[iGPMResourceGroupId]
LEFT JOIN [dbo].[AllocatedR] S ON A.Id = S.[AvailableResourceId] AND S.Number = D.Number AND S.[iGPMResourceGroupId] = D.[iGPMResourceGroupId]
)X
ORDER BY EmployeeId
输出
+--------------+---------------------+-------------+-----------+------------+------------+-----------+-----------+
| ResourceName | iGPMResourceGroupId | ProjectName | StaffedId | Capacity01 | Capacity02 | Staffed01 | Staffed02 |
+--------------+---------------------+-------------+-----------+------------+------------+-----------+-----------+
| Sakathi | 1020687 | Project 1 | 1 | 1 | 1 | 0 | 0 |
| Sakathi | 1020687 | Project 2 | (null) | 1 | 1 | (null) | (null) |
| Sakathi | 1020687 | Project 3 | 2 | 1 | 1 | 0 | 0 |
| Ravi | 1025136 | Project 2 | 3 | 0 | 0 | 1 | 1 |
| Palanisamy | 1025135 | Project 2 | (null) | 1 | 1 | (null) | (null) |
| Palanisamy | 1025135 | Project 3 | (null) | 1 | 1 | (null) | (null) |
| Manikumar | 1025164 | Project 2 | (null) | 1 | 1 | (null) | (null) |
| Manikumar | 1025164 | Project 3 | (null) | 1 | 1 | (null) | (null) |
+--------------+---------------------+-------------+-----------+------------+------------+-----------+-----------+
预期输出:
左=可用-总和(已分配)
所以,如果我答对了,您需要一个附加列“Left”和计算结果,以及一个新的列来存储每个资源的值?我想您可以通过重新设计查询并使用两个子查询来实现这一点:
WITH cte AS(
SELECT Distinct A. ResourceName, A.EmployeeId, A.[iGPMResourceGroupId], NULL AS [ProjectName], N'Available' AS Status, NULL AS StaffedId, A.[Capacity01], A.[Capacity02], NULL AS [Staffed01], NULL AS [Staffed02]
FROM [AvailableR] A
JOIN [DemandR] D ON A.[iGPMResourceGroupId] = D.[iGPMResourceGroupId]
UNION ALL
SELECT Distinct A. ResourceName, A.EmployeeId, A.[iGPMResourceGroupId], D.[ProjectName], N'Alloted' AS Status, S.[Id] AS StaffedId, A.[Capacity01], A.[Capacity02], S.[Staffed01], S.[Staffed02]
FROM [AvailableR] A JOIN [DemandR] D ON A.[iGPMResourceGroupId] = D.[iGPMResourceGroupId]
LEFT JOIN [dbo].[AllocatedR] S ON A.Id = S.[AvailableResourceId] AND S.Number = D.Number AND S.[iGPMResourceGroupId] = D.[iGPMResourceGroupId]
),
cteLeft AS(
SELECT ResourceName, EmployeeID, iGPMResourceGroupId, SUM([Capacity01] + [Capacity02]) - SUM(Staffed01 + Staffed02) AS LeftTotal
FROM cte
WHERE Status = N'Alloted'
GROUP BY ResourceName, EmployeeID, iGPMResourceGroupId
)
SELECT *, NULL AS [Left]
FROM cte
UNION ALL
SELECT Distinct ResourceName, EmployeeId, [iGPMResourceGroupId], NULL AS [ProjectName], N'Left' AS Status, NULL AS StaffedId, NULL AS [Capacity01], NULL AS [Capacity02], NULL AS [Staffed01], NULL AS [Staffed02], [LeftTotal] AS [Left]
FROM cteLeft
ORDER BY 1
查看fiddle了解详细信息:是的,你说得对,但资源Anil不应该来,因为他没有任何需求。当然,我已将需求连接添加到查询中-现在Anil已从结果中筛选出来。我也更新了fiddle,但这不是预期的结果,我只是修改了我的查询(还没有更新答案),但在这样做的时候,我想知道:在您的预期结果(问题中)中,Manicumar被分配到两个项目中,但考虑到您的示例fiddle,Manikumar根本没有分配-所以,小提琴有毛病是不是达到了预期的效果?这是我最新的小提琴: