You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过嵌套SELECT查询结合LEFT JOIN生成性别得分统计表

没问题,我帮你把这些内容整理成规范的Markdown格式,并且给出合并查询的解决方案:

数据库表与查询合并方案

一、现有数据库表

1. student表

存储学生基础信息:

student_idnamegender
1174Stevemale
1175Janefemale
1176Markmale
1177Lilyfemale

2. period表

定义不同时间段的男女最大出勤人数限制:

period_idfromtomax_session_femalemax_session_male
12018-03-022018-03-041415
22018-03-052018-03-082020

3. attendance表

记录学生出勤打卡的详细信息:

student_idperiod_iddatetapping_timesession
117412018-03-0215:30:49C
117412018-03-0219:56:15F
117412018-03-0305:10:20E
117412018-03-0312:28:54B
117412018-03-0315:31:12C
117412018-03-0412:26:33B
117412018-03-0415:39:06C
117412018-03-0418:32:40E
117412018-03-0419:56:09F
117422018-03-0505:14:55E
117522018-03-0512:27:29B
117522018-03-0519:53:19F
117522018-03-0612:25:45B
117522018-03-0812:29:41B
117522018-03-0815:32:14E
117522018-03-0820:24:03F
117512018-03-0205:15:13C
117512018-03-0212:36:19B
117512018-03-0215:38:20C
117512018-03-0219:52:09F
117512018-03-0305:14:24C
117512018-03-0312:29:26B
117512018-03-0315:31:48C
117512018-03-0319:55:41F
117512018-03-0412:29:52B
117512018-03-0415:40:39C
117512018-03-0419:53:18F
117522018-03-0505:12:05A
117522018-03-0512:29:27B
117522018-03-0515:28:16C
117522018-03-0519:55:52F
117522018-03-0605:15:10A
117522018-03-0612:32:10B
117522018-03-0615:33:11C
117522018-03-0620:13:48F
117522018-03-0705:13:25A
117522018-03-0712:28:13B
117522018-03-0715:37:28C
117522018-03-0720:23:06F
117522018-03-0805:11:47A
117522018-03-0812:31:43B
117522018-03-0815:28:29C
117522018-03-0820:21:29F
117622018-03-0720:50:43F
117622018-03-0819:54:32F
117712018-03-0205:13:30A
117712018-03-0212:38:29B
117712018-03-0219:53:38F
117712018-03-0305:12:33A
117712018-03-0312:34:48B
117712018-03-0315:39:05C
117712018-03-0320:00:51F
117712018-03-0405:10:59A
117712018-03-0412:33:56B
117712018-03-0415:39:09C
117712018-03-0419:48:59F
117722018-03-0505:12:15A
117722018-03-0512:30:53B
117722018-03-0515:34:53C
117722018-03-0519:53:19F
117722018-03-0605:12:56A
117722018-03-0612:30:03B
117722018-03-0615:31:00C
117722018-03-0619:52:40F
117722018-03-0705:12:30A
117722018-03-0712:34:48B
117722018-03-0715:40:34C
117722018-03-0719:53:47F
117722018-03-0805:11:21A
117722018-03-0812:35:21B
117722018-03-0815:36:26C
117722018-03-0819:52:32F

二、现有男女得分查询

女性得分查询

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 = s.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 = s.student_id  -- 修正原查询笔误:原语句中关联条件错误
WHERE s.gender = 'male' 
GROUP BY p.period_id

注:原查询存在关联条件笔误,a.student_id = a.student_id 应改为 a.student_id = s.student_id,否则无法正确关联学生表获取性别信息。

三、合并查询生成统一统计表

要生成包含时间段信息、总出勤数、男女得分的统一报表,我们可以将男女得分查询作为子查询,与period表左连接,同时计算每个时间段的总出勤数:

SELECT 
    p.period_id,
    p.`from`,
    p.`to`,
    COALESCE(total.total_att, 0) AS total_att,
    COALESCE(w.women_score, 0) AS women_score,
    COALESCE(m.men_score, 0) AS men_score
FROM period p
LEFT JOIN (
    SELECT period_id, COUNT(tapping_time) AS total_att
    FROM attendance
    GROUP BY period_id
) total ON p.period_id = total.period_id
LEFT JOIN (
    SELECT 
        p.period_id,
        ROUND((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 = s.student_id
    WHERE s.gender = 'female' 
    GROUP BY p.period_id
) w ON p.period_id = w.period_id
LEFT JOIN (
    SELECT 
        p.period_id,
        ROUND((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 = s.student_id
    WHERE s.gender = 'male' 
    GROUP BY p.period_id
) m ON p.period_id = m.period_id
ORDER BY p.period_id;

关键说明:

  1. 用COALESCE函数处理空值,确保无出勤记录的时间段也显示0而非NULL;
  2. 用ROUND函数将得分取整,匹配期望结果的整数格式;
  3. 新增总出勤数子查询,统计每个时间段的打卡总次数。

最终期望结果:

period_idfromtototal_attwomen_scoremen_score
12018-03-022018-03-04317853
22018-03-052018-03-08519010

内容的提问来源于stack exchange,提问作者codefighter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:08:45