【问题标题】:Select result set into multiple rows dynamically in SQL Server在 SQL Server 中动态选择结果集到多行
【发布时间】:2021-02-21 09:46:26
【问题描述】:

我有包含可用和分配信息的 SQL Server 数据,我需要显示每个资源的可用数据、分配数据和余额数据等报告。

现在我在单行中拥有所有信息,并且需要计算余额数据。如何检索预期数据?

当前数据和输出

SQL Fiddle

可用

   +---+-------------+------------+---------------------+---------+------------+------------+
   | 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     |
  +----+---------------------+----------------+------------+---------------------+------------+-----------+-----------+

查询

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) |
+--------------+---------------------+-------------+-----------+------------+------------+-----------+-----------+

预期输出:

= 可用 - 总和(已分配

+--------------+---------------------+-------------+-----------+------------+------+------+
| ResourceName | iGPMResourceGroupId | ProjectName | Status    | StaffedId  | 01   | 02   |
+--------------+---------------------+-------------+-----------+------------+------+------+
|      Sakathi |                     |             | Available | (null)     | 1    | 1    |   
|      Sakathi |             1020687 |   Project 1 | Alloted   | 1          | 0.30 | 0.30 |
|      Sakathi |             1020687 |   Project 2 | Alloted   | (null)     |(null)|(null)|
|      Sakathi |             1020687 |   Project 3 | Alloted   | 2          | 0.30 | 0.30 |
|      Sakathi |                     |             | Left      | (null)     | 0.40 | 0.40 | 
|      Ravi    |                     |             | Available | (null)     | 0.50 | 0.50 | 
|      Ravi    |             1025136 |   Project 2 | Alloted   | 3          | 0.50 | 0.50 | 
|      Ravi    |                     |             | Left      | (null)     | 0    | 0    | 
|   Palanisamy |                     |             | Available | (null)     | 1    | 1    | 
|   Palanisamy |             1025135 |   Project 2 | Alloted   | (null)     |(null)|(null)|
|   Palanisamy |             1025135 |   Project 3 | Alloted   | (null)     |(null)|(null)|
|   Palanisamy |                     |             | Left      | (null)     | 1    | 1    |
|    Manikumar |                     |             | Available | (null)     | 1    | 1    | 
|    Manikumar |             1025164 |   Project 2 | Alloted   | (null)     |(null)|(null)|
|    Manikumar |             1025164 |   Project 3 | Alloted   | (null)     |(null)|(null)|
|    Manikumar |                     |             | Left      | (null)     | 1    | 1    |
+--------------+---------------------+-------------+-----------+------------+------+------+

【问题讨论】:

    标签: sql sql-server pivot common-table-expression unpivot


    【解决方案1】:

    那么,如果我没听错的话,您需要一个额外的“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
    

    详情见小提琴:http://sqlfiddle.com/#!18/2a30d/16/0

    【讨论】:

    • 是的,你没看错,但是资源 Anil 不应该来,因为他没有任何需求。
    • 当然,我在查询中添加了 Demand Join - 现在 Anil 从结果中被过滤掉了。我也更新了小提琴
    • 这不是预期的结果
    • 好的,我刚刚修改了我的查询(尚未更新答案),但在这样做的同时我想知道:在您的预期结果中(在问题中) Manicumar 分配在两个项目中,但考虑到您的示例小提琴,Manikumar 根本没有分配 - 那么,小提琴是否有问题而不是预期的结果?这是我更新的小提琴:sqlfiddle.com/#!18/2a30d/25/0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2021-10-29
    • 2018-01-06
    • 2020-03-13
    • 2014-10-09
    • 1970-01-01
    相关资源
    最近更新 更多