Mysql 如何在包含左联接的其他选择查询中包含选择查询 学生表格 期间表格,此表格用于确定学生可以聚集的最大与会者人数 出勤表,学生出勤的虚拟详细信息
我找到了一个查询,可以根据性别计算学生的平均分数, 妇女: 男子:Mysql 如何在包含左联接的其他选择查询中包含选择查询 学生表格 期间表格,此表格用于确定学生可以聚集的最大与会者人数 出勤表,学生出勤的虚拟详细信息,mysql,select,Mysql,Select,我找到了一个查询,可以根据性别计算学生的平均分数, 妇女: 男子: SELECT (COUNT(a.tapping_time)/2)/p.max_session_male*100 AS 'men_score ' FROM period p LEFT JOIN attendance a ON p.period_id = a.period_id LEFT JOIN student s ON a.student_id = a.student_id WHERE s.gender = 'male' GR
SELECT (COUNT(a.tapping_time)/2)/p.max_session_male*100 AS 'men_score '
FROM period p
LEFT JOIN attendance a ON p.period_id = a.period_id
LEFT JOIN student s ON a.student_id = a.student_id
WHERE s.gender = 'male'
GROUP BY p.period_id
但是如何在一张桌子上得分呢
所需结果:
-----------------------------------------------------------------------------
| period_id | from | to | total_att | women_score | men_score |
|-----------|------------|------------|-----------|-------------|-----------|
| 1 | 2018-03-02 | 2018-03-04 | 31 | 78 | 30 |
| 2 | 2018-03-05 | 2018-03-08 | 41 | 95 | 7.5 |
-----------------------------------------------------------------------------
使用条件聚合:
SELECT
period_id,
MIN(date) AS `from`,
MAX(date) AS `to`,
COUNT(*) AS total_att,
100 * COUNT(CASE WHEN s.gender = 'male'
THEN a.tapping_time END) / p.max_session_male AS male_score,
100 * COUNT(CASE WHEN s.gender = 'female'
THEN a.tapping_time END) / p.max_session_female AS female_score
FROM period p
LEFT JOIN attendance a
ON p.period_id = a.period_id
LEFT JOIN student s
ON a.student_id = a.student_id
GROUP BY p.period_id;
请注意,在按
period\u id
分组时,选择max\u session\u male
和max\u session\u female
列可能是可疑的。但是如果period\u id
是period
表的主键,那么就可以了。很抱歉@Tim结果与我需要的不匹配,不能计算分数number@codefighter我更新了我的答案,使之完全符合您的预期输出。我的答案的关键仍然是使用条件聚合。学生可以聚集的最大出席人数-嗯?
SELECT (COUNT(a.tapping_time)/2)/p.max_session_female*100 AS 'women_score'
FROM period p
LEFT JOIN attendance a ON p.period_id = a.period_id
LEFT JOIN student s ON a.student_id = a.student_id
WHERE s.gender = 'female'
GROUP BY p.period_id
SELECT (COUNT(a.tapping_time)/2)/p.max_session_male*100 AS 'men_score '
FROM period p
LEFT JOIN attendance a ON p.period_id = a.period_id
LEFT JOIN student s ON a.student_id = a.student_id
WHERE s.gender = 'male'
GROUP BY p.period_id
-----------------------------------------------------------------------------
| period_id | from | to | total_att | women_score | men_score |
|-----------|------------|------------|-----------|-------------|-----------|
| 1 | 2018-03-02 | 2018-03-04 | 31 | 78 | 30 |
| 2 | 2018-03-05 | 2018-03-08 | 41 | 95 | 7.5 |
-----------------------------------------------------------------------------
SELECT
period_id,
MIN(date) AS `from`,
MAX(date) AS `to`,
COUNT(*) AS total_att,
100 * COUNT(CASE WHEN s.gender = 'male'
THEN a.tapping_time END) / p.max_session_male AS male_score,
100 * COUNT(CASE WHEN s.gender = 'female'
THEN a.tapping_time END) / p.max_session_female AS female_score
FROM period p
LEFT JOIN attendance a
ON p.period_id = a.period_id
LEFT JOIN student s
ON a.student_id = a.student_id
GROUP BY p.period_id;