计算发生次数

时间:2015-03-27 08:47:12

标签: mysql sql

Person table
---------------------
|email (pk)   | name|
---------------------
|a@hotmail.com| A   |
|b@hotmail.com| B   |
|c@hotmail.com| C   |

 Role table
---------------------------------
|Role               |Power     |
-------------------------------|
|Primary            |20        |
|Secondary          |10        |
|Supervisor         |30        |
--------------------------------
Assignment table
------------------------------------------------------------------
|Team Name| Term    | Role              |Email         |Join_date
------------------------------------------------------------------
|AA       |2013_1   |Supervisor |a@hotmail.com |2013-08-05
|BB       |2013_1   |Secondary  |a@hotmail.com |2013-08-05
|CC       |2013_1   |Supervisor |c@hotmail.com |2013-08-05
|DD       |2013_1   |Secondary  |a@hotmail.com |2013-08-05
|AA       |2013_1   |Secondary  |b@hotmail.com |2013-08-05

我的预期结果

|name | email        | num_of_time_pri | num_of_time_sec | num_of_time_sup|
---------------------------------------------------------------------------------------
|A    | a@hotmail.com|0                |2                | 1              |
|B    | b@hotmail.com|0                |1                | 0              |
|C    | c@hotmail.com|0                |0                | 1              |

使用此查询

select distinct p.name,p.email from assignment a,person p where term ='2013_1' and a.email = p.email;

假设它返回3行,如person表中所示。从那里,我想得到预期的结果表。我如何从那里继续?

1 个答案:

答案 0 :(得分:0)

您应该做的是对RDBMS中的数据进行分组和计数:

SELECT   p.name, email, Role, COUNT(a.email)
FROM     (Person p CROSS JOIN Role r) LEFT JOIN Assignment a USING (email, Role)
GROUP BY email, Role

然后根据需要在应用程序代码中将其转动。