1

好吧,我可能也早些时候发布了这个,但到目前为止找不到答案,所以请帮我解决这个问题。

我的数据库结构:

ATTActivity表)

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

产品_桌子

  • Product_ID (PK)
  • 产品名称

项目表

  • Project_ID (PK)
  • 项目名

Employee_Table

  • Emp_ID (PK)
  • F_名称。

约束

  • In 1 Project --> 多个员工可以工作
  • 1 位员工 --> 可以分配多个活动 ( Act_ID)
  • 在任何给定的时间点Status可以是任何给定的值

现在在我的 SQL 查询中,我想做的是负载检查::

活动(由 表示Act_ID)分配给员工,由 表示Assigned_To_ID,对于项目(Project_IDATT_Table)和特定状态。我需要从我的 SQL 查询中输出 5 个值:

  1. 员工的名字
  2. 项目名称
  3. 分配给员工(在 A 中)的总活动数。
  4. 为员工(在 A)分配的活动数量,其中状态为新建或处理中。
  5. 加载。那将是 = C/D * 100(C 比 D 大,这是显而易见的。)

现在可能有一个条件,一个员工假设 E1 正在处理项目 P1,P2。所以我的表输出将如下所示:

A    B     C    D     E
E1   P1    
E1   P2 

所以这里 C、D、E 将具有与该项目的活动相对应的值(P1 或 P2)

到目前为止我已经尝试过了::

SELECT 
    F_Name AS A, 
    Project_Name AS B, 
    Count(Act_ID) AS C, 
    Count(Act_ID) AS D
FROM 
    Employee_Table, ATT_Table, Project_Table
WHERE 
    ATT_table.[Assigned_To_ID] = Employee_Table.[Emp_ID] 
    AND Project_Table.[Project_ID] = ATT_Table.[Project_ID] 
    AND Count(Act_ID) IN (SELECT Count(Act_ID)
                          FROM ATT_Table
                          WHERE ATT_Table.[Status] <> 'Closed' 
                            AND ATT_Table.[Status] <> 'OnHold')
GROUP BY 
     F_Name, Project_Name;

我得到了 A、B、C。但是当我尝试查找用于状态检查的活动时,我无法执行此查询,因为它给了我一条消息,无法在 WHERE 子句中写入计数。请帮我解决这个问题。谢谢..

4

3 回答 3

1
SELECT 
      E1.F_Name AS A, 
      P1.Project_Name AS B, 
      Count(A1.Act_ID) AS C, 
      sum( IF( A1.Status IN ( 'Closed', 'OnHold' ), 0, 1 )) as D,
      (Count(A1.Act_ID) / sum( IIF( A1.Status IN ( 'Closed', 'OnHold' ), 0, 1 ))) * 100 as E
   FROM 
      ATT_Table A1
         JOIN Employee_Table E1
            ON A1.Assigned_To_ID = E1.Emp_ID
         JOIN Project_Table P1
            ON A1.Project_ID = P1.Project_ID
   GROUP BY 
      F_Name, Project_Name;
于 2012-04-27T15:09:11.860 回答
1

也许像这样。尝试一下....

Select Emp.F_Name As A,
  Proj.Project_Name As B,
  Count(ATT.Act_ID) As C,
  sum( IIF( ATT.Status IN ( 'Closed', 'OnHold' ), 0, 1 )) as D,
  (Count(ATT.Act_ID) / sum( IIF( ATT.Status IN ( 'Closed', 'OnHold' ), 0, 1 ))) * 100 as E 
From Employee_Table As Emp Inner Join
  (Product_Table As Prod Inner Join
  (ATT_Table As ATT Inner Join Project_Table As Proj On Proj.Project_ID=ATT.Project_ID) 
  On Prod.Product_ID=ATT.Product_ID) 
  On Emp.Emp_ID=ATT.Assigned_To_ID
Group By Emp.F_Name,Proj.Project_Name
于 2012-04-28T19:34:00.277 回答
1

你提到Product_Table了,但我不明白你的问题是如何涉及该表的。对于其余部分,我将从子查询中提取列 A、B、C 和 D,并在外部查询中计算 E。

SELECT
    sub.F_Name AS A,
    sub.Project_Name AS B,
    sub.C,
    sub.D,
    ((sub.C / sub.D) * 100) AS E
FROM
    (
        SELECT
            Emp.F_Name,
            Proj.Project_Name,
            Count(att.Act_ID) AS C,
            Sum(IIf(att.Status IN ('New', 'InProcess'), 1, 0)) AS D
        FROM
            (ATT_Table AS att
            INNER JOIN Employee_Table AS Emp
            ON Emp.Emp_ID = att.Assigned_To_ID)
            INNER JOIN Project_Table AS Proj
            ON Proj.Project_ID = att.Project_ID 
        GROUP BY
            Emp.F_Name,
            Proj.Project_Name
    ) AS sub;
于 2012-04-28T21:42:05.733 回答