やりたいこと
MySQLで学生ごとの出席数、欠席数、遅刻数、遅刻分欠席(3回で欠席1回)を取得したい
遅刻分欠席(3回で欠席1回)は月毎に3回遅刻したら1欠席にカウントしたい
悩んでいること
期間ごとに上記それぞれの出席状況を取得したいが、「遅刻分欠席(3回で欠席1回)」のみ書き方がわからない
lectures.finish_timeで日付を絞っても過去全ての欠席数から計算された値が表示されてしまう
考えたこと
DIVを使って遅刻/3としているため、全体の値から計算されてしまう
(例: 5月に2回遅刻、6月に2回遅刻の場合、合計遅刻数は4回なので、1欠席1遅刻になるが実際には月を跨いでいるので欠席は0回とカウントしたい欠席)
select 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回)" from attend_logs join students on attend_logs.student_id = students.id join lectures on lectures.id = lecture_attend_logs.lecture_id where lectures.finish_time in (2021/05/01 and 2021/06/30) group by students.name
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 |
拙い説明で申し訳ありませんが、ご教授いただけないでしょうか。
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー