【やりたいこと】
MySQLで学生ごとの出席率を取得したい
【クエリの条件】
SELECT文で出席数、欠席数、遅刻数、遅刻分欠席(3回で欠席1回)を取得している
遅刻分欠席(3回で欠席1回)は月毎に3回遅刻したら1欠席にカウント(例: 7月に2回遅刻、8月に2回遅刻の場合、合計遅刻数は4回なので、1欠席1遅刻になるが実際には月を跨いでいるので欠席は0回とカウントしたい欠席)
【悩んでいること】
日付を指定した際の合計出席率を表示させたい。
現在の書き方では月毎の出席率は出るが、合計は出ない。
下記のように条件を絞った場合、7月、8月の出席率は出るが2ヶ月の出席率の合計は出ない
where finish_time in 2021-07-01 and 2021-08-31)
【クエリ】
select lectures.finish_time as "期間", students.name as "学生", count(attend_logs.attend_status = "attended" or null) as "出席(授業数)", count(attend_logs.attend_status = "absented" or null) as "欠席(授業数)", count(attend_logs.attend_status = "late" or null) as "遅刻数", count(attend_logs.attend_status = "late" or null) DIV 3 as "遅刻分欠席(3回で欠席1回)", ROUND((count(attend_logs.attend_status = "attended" or null ) + (count(attend_logs.attend_status = "late" or null) - count(attend_logs.attend_status = "late" or null) DIV 3) + count(attend_logs.attend_status = "public_absented" or null) + count(attend_logs.attend_status = "closed"or null )) / count(attend_logs.attend_status),5) * 100 as "出席率合計(%)" from attend_logs join students on attend_logs.student_id = students.id join lectures on lectures.id = attend_logs.lecture_id where lectures.finish_time in (2021/05/01 and 2021/06/30) group by students.name, date_format(lectures.finish_time, '%Y%M')
【attend_logsテーブル】
NAME | SQL Type | Limit |
---|---|---|
id | bigint(20) | 8 |
student_id | bigint(20) | 8 |
lecture_id | bigint(20) | 8 |
attend_status | varchar(255) | 255 |
updated_at | datetime | |
created_at | datetime | |
deleted_at | datetime |
【studentsテーブル】
NAME | SQL Type | Limit |
---|---|---|
id | bigint(20) | 8 |
name | varchar(10) | 10 |
updated_at | datetime | |
created_at | datetime | |
deleted_at | datetime |
【lecturesテーブル】
NAME | SQL Type | Limit |
---|---|---|
id | bigint(20) | 8 |
name | varchar(10) | 10 |
start_time | datetime | |
finish_time | datetime | |
updated_at | datetime | |
created_at | datetime | |
deleted_at | datetime |
あなたの回答
tips
プレビュー