質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

958閲覧

MySQLで月ごとの欠席数を取得する方法

rat_mouse

総合スコア17

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2021/07/26 05:52

やりたいこと
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テーブル

NAMESQL TypeLimit
idbigint(20)8
student_idbigint(20)8
lecture_idbigint(20)8
attend_statusvarchar(255)255
updated_atdatetime
created_atdatetime
deleted_atdatetime

studentsテーブル

NAMESQL TypeLimit
idbigint(20)8
namevarchar(10)10
updated_atdatetime
created_atdatetime
deleted_atdatetime

lecturesテーブル

NAMESQL TypeLimit
idbigint(20)8
namevarchar(10)10
start_timedatetime
finish_timedatetime
updated_atdatetime
created_atdatetime
deleted_atdatetime

拙い説明で申し訳ありませんが、ご教授いただけないでしょうか。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mdj

2021/07/26 06:01

期間は「複数月(2021/05/01 and 2021/06/30)」だけど、遅刻欠席は「1か月単位」ということですか?
rat_mouse

2021/07/26 06:07

コメントありがとうございます。 そうです、1ヶ月単位です。 例えば5月から7月の範囲で絞った際に 5月遅刻3回 = 1欠席 6月遅刻2回 = 0欠席 7月遅刻5回 = 1欠席 となり、2欠席として取得したいのですが、 現状の書き方では10遅刻 = 3欠席になります。 実際にはMetabaseでフィルターを作成して期間を絞れるようにしたいと考えています。
mdj

2021/07/26 06:28

in句を使って期間ごとに更にwhereで処理するくらいしか思いつかないです。すいません~。
sazi

2021/07/26 06:46 編集

累計という訳ではないですから、月ごとの集計は必須だと思います。 ネストで月毎の集計を行ったものを、再度集計でしょうね。
rat_mouse

2021/07/26 06:57

>ネストで月毎の集計を行ったものを、再度集計でしょうね。 回答ありがとうございます。 count(attend_logs.attend_status = "late" or null) DIV 3 as "遅刻分欠席(3回で欠席1回)" サブクエリでこちらに月毎の集計追記するということでしょうか・・・?
yambejp

2021/07/26 07:57

サンプルデータがあれば例示下さい
guest

回答2

0

sql

1where 2 lectures.finish_time in (2021/05/01 and 2021/06/30) 34where 5 lectures.finish_time BETWEEN 2021/05/01 and 2021/06/30 6ではないですか?

投稿2021/07/26 12:12

takanaweb5

総合スコア358

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

ネストで月毎の集計を行ったものを、再度集計

SQL

1select name as 学生 2 , sum(出席_授業数) as 出席_授業数 3 , sum(欠席_授業数) as 欠席_授業数 4 , sum(遅刻数) as 遅刻数 5 , sum(遅刻分欠席) as 遅刻分欠席 6from ( 7 select students.name 8 , count(attend_logs.attend_status = 'attended' or null) as 出席_授業数 9 , count(attend_logs.attend_status = 'absented' or null) as 欠席_授業数 10 , count(attend_logs.attend_status = 'late' or null) as 遅刻数 11 , count(attend_logs.attend_status = 'late' or null) as DIV 3 as 遅刻分欠席 12 from attend_logs 13 inner join students 14 on attend_logs.student_id = students.id 15 inner join lectures 16 on lectures.id = attend_logs.lecture_id 17 where lectures.finish_time in (2021/05/01 and 2021/06/30) 18 group by students.name, date_format(lectures.finish_time, '%Y%m') 19) mnth 20group by name

投稿2021/07/26 07:28

編集2021/07/30 06:26
sazi

総合スコア25188

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rat_mouse

2021/07/26 07:42

回答ありがとうございます。 ご提示いただいた構文だとサブクエリに主テーブルが結合されていないのでエラーになります。 念の為attend_logsとstudentsに結合してみたのですがエラーのようです。
sazi

2021/07/26 10:30 編集

質問の内容を基本転記しただけですけど、「サブクエリに主テーブルが結合されていない」とは何のことですか? 内容的には、質問のSQLのgroup byに年月(date_format(lectures.finish_time, '%Y%M'))を追加して、その外側では、年月を外した集計をするという事です。 ※質問のSQLにある「lecture_attend_logs」は誤記だと思って修正していますが。
rat_mouse

2021/07/30 05:48

申し訳ありません、見間違えていました。 と提示いただいた方法で正常に出席日数を集計できました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問