使用聚合函数编写SQL查询。

时间:2012-03-30 19:55:42

标签: mysql sql database ms-access

我早些时候已经发布了这种类型的问题,但现在我需要以不同的方式进行。我有一个表结构:

ATT_Table : Fields : Act_ID, Assigned_To_ID, Status, Product

Act_ID是主键,Assigned_To_ID被引用到Employee_Table Emp_ID。状态可以是新建,正在处理,已关闭或处于保留状态。产品可以是任何XYZ值。

Employee_Table : Fields : Emp_ID, F_Name, Product

此处,Emp_ID是主键。产品与ATT_Table相同并且将包含ATT_Table中的值,每个Assigned_To_ID与它包含的Emp_ID相同。就好像Emp_ID是1而Product是X,然后在ATT_Table中,对于Assigned_To_ID 1,Product值将是X.我知道它是副本,我可以避免这种情况。

现在我想做的是。首先,我想找到每个产品的员工总数。假设此值为A.现在,我想计算按产品分组的特定活动的员工数量,以及状态为新建或正在处理的状态。让我们说恩B.喜欢。如果员工的F_Name C(Emp_ID = 1),D(Emp_ID = 2),E(Emp_ID = 3),F(Emp_ID = 4)属于产品X.那么根据这个我的A是4.现在在ATT_Table Assigned_To_ID是1和3和那里产品相同,即X和状态是1(新)3(在过程中)。对于2和4,它已关闭或暂停。现在我的B根据这个是2.最后A / B会给我第三个值让我们说H.在我的查询表中我想要A,B和H的值。你能告诉我怎么做到这一点。它有点棘手,无法得到这个。请帮忙。谢谢。

1 个答案:

答案 0 :(得分:0)

这样的事情应该这样做:

SELECT g.product,
   a,
   b,
   g.a / g.b h
  FROM (  SELECT e.product,
             COUNT (DISTINCT assigned_to_id) a,
             COUNT (
                DISTINCT CASE
                            WHEN status IN ('new', 'in process')
                            THEN
                               assigned_to_id
                         END)
                b
        FROM    Employee_Table e
             LEFT OUTER JOIN
                ATT_Table a
             ON (e.emp_id = a.assigned_to_id)
    GROUP BY e.product) g;

如果您不想获得ATT_Table中没有相应记录的产品,您可以删除LEFT OUTER JOIN并使用INNER join