在MySQL查询中对记录的子集执行一些算术运算

时间:2019-05-21 20:29:19

标签: mysql sql select

我有一个包含出勤记录的MySQL表。相关列标识与会者,会话和出席状态(已确认/已拒绝/无响应)。我还有第二张表,其中包含与会者的个人信息,包括他们加入该组的日期。

我正在尝试构建一个查询,该查询将输出所有与会者的列表,他们出席会议的次数以及其规律性,表示为他们出席的会议百分比(相对于会议总数)。问题在于,自从与会者加入组以来,会话总数仅应包含会话。

因此,对于第一部分,我的查询是:

SELECT name, count(*)
FROM attendance, members
WHERE attendance.attend = 2 and
      attendance.member_number = members.number
GROUP BY attendance.member_number, attendance.attend
HAVING count(*) > 0
ORDER BY count(*) desc

这将返回所有与会者的姓名,以及每个与会者已参加的会议数。但是,我也想添加第三列。

因此,对于每条记录,我首先必须找出什么是member.member_since日期,然后仅查询日期大于member_since的每个成员的出勤记录组,获取其计数,然后从该子集获得atteneance.attend = 2的计数,然后计算该子集计数的百分比代表第二个计数(具有出席人数的记录= 2)。

如何编写查询?

数据如下:

表成员:

number, name, join_date
001, Peter James, 2016-07-26
002, John Smith, 2014-06-04

表出席:

member_number, attend, date
001, 2, 2019-05-11
001, 1, 2019-05-04
001, 2, 2019-04-26
001, 2, 2019-04-18
002, 2, 2014-08-01
002, 1, 2016-08-01
002, 1, 2019-05-04

所需的结果将是获得以下信息:

Name, Attended, percentage
Peter James, 3, 75%
John Smith, 1, 14%

换句话说,虽然有6次会议,但Peter James仅参加了前四次会议,并参加了其中的3次会议(占75%),而John Smith自开始以来就一直是成员,因此他的参加是满分6分。

结构有所简化(有一个“会话”表,其中包含有关会话的详细信息,包括日期,“出勤”表引用其关键列“ att_number”,而不是实际日期),但点是一样的。

1 个答案:

答案 0 :(得分:1)

仅在日期上加入表,以获取自成员加入以来的会话总数。然后,使用条件SUM()获取成员参加的会话数。将它们除以得到百分比。

SELECT m.name, SUM(m.number = a.member_number AND a.attend = 2) AS attendance, 100*SUM(m.number = a.member_number AND a.attend = 2)/COUNT(*) AS percent
FROM members AS m
JOIN attendance AS a ON a.date >= m.member_since
GROUP BY m.number
ORDER BY attendance DESC