繁体   English   中英

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

[英]Performing some arithmetic operations inside a MySQL query on a subset of records

我有一个包含考勤记录的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次会议,但彼得·詹姆斯只参加了最近四次会议,并参加了其中的3次(75%),而约翰·史密斯从一开始就一直是成员,所以他的出席是六分之一。

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

仅在日期上加入表,以获取自成员加入以来的会话总数。 然后,使用条件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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM