2012-04-27 136 views
1

嗯,我可能已经发布了此前也,但无法找到答案,所以请帮助我在这一个。需要帮助我的SQL查询

我的数据库结构:

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_Table

  • PRODUCT_ID(PK)
  • PRODUCT_NAME

Project_Table

  • PROJECT_ID(PK)
  • PROJECT_NAME

Employee_Table

  • EMP_ID(PK)
  • F_Name。

约束

  • 在1个项目 - >多个员工可以工作
  • 1名员工 - >可以分配多个活动(Act_ID
  • 在任何给定时间点Status可以是任何给定值

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

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

  1. 员工
  2. 项目
  3. 活动共计雇员的义务(一)分配数的名称。
  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子句我不能执行这个查询。请帮助我解决这个问题。 谢谢..

回答

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

雅......我很抱歉。 Product_Table不涉及。我的错误.. – 2012-04-29 08:36:50

+0

先生,我有这个1权利。但是,今天我知道我的需求有一点变化,所以我发布了一个新问题,它只与这个问题有关。我已经把这个标记为答案,因为这个问题很好。我给你的链接http://stackoverflow.com/questions/10373043/need-to-write-an-sql-query谢谢。 – 2012-04-29 14:43:19

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

那么,先生谢谢您的回复。但是,当我在SQL查询向导中的MSaccess中运行它时。我在FROM子句中收到类似语法错误的错误,然后将其指向我在FROM子句中写入的JOIN。并且还会出现“未定义的函数IF”错误。有一件事我注意到你写了S1.Status ..但是S1在哪里?请帮忙。再次感谢。 – 2012-04-28 05:55:00

+0

@ user1230183,对不起,您没有“TAG”分配,这是一个ACCESS查询。它们的语法略有不同。我从SUM(IF())改为SUM(IIF()) – DRapp 2012-04-28 11:33:35

+0

但是'S1'别名呢?你可能是指'A1'而不是? – 2012-04-28 13:06:47

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

先生,今天我gt知道一点点改变我的要求,所以我有发布了一个新问题,它只与这个问题有关。你能帮我这个http://stackoverflow.com/questions/10373043/need-to-write-an-sql-query谢谢。 – 2012-04-29 14:44:51