在单个记录中以两种不同的方式聚合数据

时间:2012-04-29 14:43:02

标签: sql ms-access

  

可能重复:
  Need help for my SQL query

好吧,我可能也早些发布了这个,但我的要求有所改变,所以请帮我解决这个问题。

我的数据库结构:

ATT Activity表)

  • Act_ID(PK)
  • Assigned_To_ID(FK,请参阅Emp_ID
  • Project_ID(FK,请参阅Project_ID
  • Product_ID(FK,请参阅Product_ID
  • 状态(可以是New, OnHold, Cancel, Closed

Product_Table

  • Product_ID(PK)
  • PRODUCT_NAME

Project_Table

  • Project_ID(PK)
  • PROJECT_NAME

Employee_Table

  • Emp_ID(PK)
  • F_Name。

Emp_Product_Project_Mapping

(此表基本上映射了哪个员工被分配到哪个产品和哪个项目。在所有3列中允许重复输入,以映射1个员工可以分配给多个项目或产品)

  • Emp_IDFK(FK参考Emp_ID PK)
  • Product_IDFK(FK指Product_ID PK)
  • Project_IDFK(FK指Project_ID PK)

约束

  • 在1个项目中 - >多名员工可以工作
  • 1名员工 - >可以分配多个活动(Act_ID
  • 在任何给定的时间点Status可以是任何给定的值。
  • 在任何给定时间点,可以将活动分配给1个产品和1个项目。

现在在我的SQL查询中我想要做的是加载检查::

分配给员工的活动(由Act_ID表示)由Assigned_To_ID表示,用于产品(Project_ID中的项目ATT_Table){{1}在Product_ID)和特定的状态。我需要从我的SQL查询中输出5个值:

  1. 员工姓名
  2. 产品名称
  3. 分配给该产品的总活动数量(在2中),其中Status是New或InProcess。(这里,我统计了与Product相关的所有活动(2)。无论对象是谁它与员工无关(1)。我希望在我的4rth部分)。
  4. 现在,我想要分配Employee(1)的活动数量(我从(3)得到的总数中)。希望我自己清楚。在第3天,它是分配给产品的总活动(在2中)。在4日,我的第3次结果中的活动被分配给第1名员工。
  5. 负载。那将是=(结果为3)/(结果为4)* 100((结果为3)的值大于(结果为4),这是显而易见的。)
  6. 现在可能存在这样的情况:员工让E1说正在使用产品P1,P2。所以我的表输出看起来像这样::

    ATT_table

    所以这里3,4,5将具有与该产品(P1或P2)的活动相对应的值

    请帮我解决这个问题。使用MSaccess数据库。 谢谢..

1 个答案:

答案 0 :(得分:1)

由于您希望以两种独立的方式“分组”您的数据,因此您无法使用单个GROUP BY子句执行此操作。您必须使用子查询计算每个产品的活动总数;在这里我也使用子查询来计算每个员工在这些产品上的活动,因为我认为比在父母中混合一个GROUP BY子查询和GROUP BY更容易理解:

SELECT
  Employee_Table.F_Name,
  Product_Table.Product_Name,
  AllActivities.Count,
  EmployeeActivities.Count,
  EmployeeActivities.Count / AllActivities.Count AS Load
FROM
  Employee_Table, Product_Table
  INNER JOIN (
    SELECT Product_ID, COUNT(*) AS Count
    FROM ATT
    GROUP BY Product_ID
  ) AS AllActivities ON
    AllActivities.Product_ID = Product_Table.Product_ID
  INNER JOIN (
    SELECT Assigned_To_ID, Product_ID, COUNT(*) AS Count
    FROM ATT
    GROUP BY Assigned_To_ID, Product_ID
  ) AS EmployeeActivities ON
        EmployeeActivities.Assigned_To_ID = Employee_Table.Emp_ID
    AND EmployeeActivities.Product_ID     = Product_Table.Product_ID