accesssql:如何检索用户id被分配到多个位置的多个值的总和

yuvru6vn  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(206)

我正在开发一个access数据库,用于将任务分配给人员并跟踪任务状态和工作量。可以将单个用户标识分配给与特定任务关联的多个字段之一。在本例中,任务表具有“techreviewerid”“designerid”“techreviewerworkload”和“designerworkload”字段
我希望一个查询为每个人返回一行,两个摘要列合计分配给他们的所有工作负载。因此,如果我是id1,我希望第3列返回所有任务中“techreviewerid=1”的“techreviewerworkload”的和,第4列返回所有任务中“designerworkload”的和,其中“designerid=1”
我已经成功地编写了两个独立的查询来实现这一点:

SELECT MESPersonnel.MESID, MESPersonnel.PersonnelName, 
    IIF(SUM(DesignerTask.DesignerWorkload) IS NULL, 0, SUM(DesignerTask.DesignerWorkload)) AS 
    TotalDesignerWorkload

    FROM 
    (MESPersonnel LEFT OUTER JOIN Task AS DesignerTask ON (MESPersonnel.MESID = 
    DesignerTask.DesignerID 
    AND DesignerTask.DueDate < CDATE('2020-07-30') AND DesignerTask.DueDate > CDATE ('2020-05-01')))

        WHERE MESPersonnel.PositionID = 1
            GROUP BY MESPersonnel.MESID, MESPersonnel.PersonnelName;

此查询提供下表:

MESID  PersonnelName  TotalDesignerWorkload
  1    John Doe                40
  2    Dohn Joe                20

我可以用“tech reviewer”术语替换“designer”术语的所有示例,从而创建一个几乎相同的查询。
我要找的是这样一张table:

MESID  PersonnelName  TotalDesignerWorkload  TotalReviewerWorkload  
  1      John Doe              40                     10            
  2      Dohn Joe              20                     20

我试图通过多个外部连接将这两个结合起来,结果导致了非常不准确的和。我知道如何解决不同表中的项的问题,但是当我使用同一表中的两个项时,我不知道如何解决。在我的查询中是否有某种access支持的条件和?
编辑:样例原始数据

Task Table

    TaskID  DesignerID  TechReviewerID  DesignerWorkload  TechReviewerWorkload  DueDate
      1         1              2                40                20             06-20-2020
      2         2              1                20                10             06-20-2020

    MESPersonnel Table

    MESID  PersonnelName
      1       John Doe
      2       Dohn Joe
i5desfxk

i5desfxk1#

考虑:
查询1:taskunion
将数据重新排列为规范化结构

SELECT TaskID, DesignerID AS UID, PersonnelName, DesignerWorkload AS Data, DueDate, "Design" AS Cat FROM MESPersonnel 
    INNER JOIN Task ON MESPersonnel.MESID = Task.DesignerID
UNION SELECT TaskID, TechReviewerID, PersonnelName, TechReviewerWorkload, DueDate, "Tech" FROM MESPersonnel 
    INNER JOIN Task ON MESPersonnel.MESID = Task.TechReviewerID;

查询2:

TRANSFORM Sum(Data) AS SumData
SELECT UID, PersonnelName
FROM TaskUNION
WHERE DueDate BETWEEN #5/1/2020# AND #7/31/2020#
GROUP BY UID, PersonnelName
PIVOT Cat;

另一种方法是对任务表进行两个简单的、经过过滤的聚合查询,然后将这两个查询连接到mespersonnel。以下为一体式陈述:

SELECT MESID, PersonnelName, SumOfDesignerWorkload, SumOfTechReviewerWorkload
FROM (
   SELECT DesignerID, Sum(DesignerWorkload) AS SumOfDesignerWorkload
   FROM Task WHERE DueDate BETWEEN #5/1/2020# AND #7/31/2020# GROUP BY DesignerID) AS SumDesi 
RIGHT JOIN ((
   SELECT TechReviewerID, Sum(TechReviewerWorkload) AS SumOfTechReviewerWorkload
   FROM Task WHERE DueDate BETWEEN #5/1/2020# AND #7/31/2020# GROUP BY TechReviewerID) AS SumTech 
RIGHT JOIN MESPersonnel ON SumTech.TechReviewerID = MESPersonnel.MESID) 
ON SumDesi.DesignerID = MESPersonnel.MESID;

相关问题