MySQLで特定の年の出席者数と欠席者数を同時に取得する方法
MySQLでは、IF()関数とSUM()集計関数を組み合わせることで、特定の年の「出席(Present)」と「欠席(Absent)」の学生数を1つのクエリで同時に取得できます。この記事では、実際にテーブルを作成し、データを登録したうえで、具体的な手順を解説します。
1. サンプルテーブルの作成
まず、出欠状況(Attendance)と年度(CurrentYear)を格納するテーブルを作成します。
mysql> create table DemoTable1617
-> (
-> Attendance varchar(20),
-> CurrentYear int
-> );
Query OK, 0 rows affected (0.48 sec)
2. テストデータの挿入
次に、INSERTコマンドを使ってサンプルレコードをいくつか登録します。
mysql> insert into DemoTable1617 values('Present',2019);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable1617 values('Absent',2019);
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable1617 values('Absent',2017);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1617 values('Present',2019);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable1617 values('Present',2018);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1617 values('Present',2019);
Query OK, 1 row affected (0.14 sec)
3. 登録データの確認
SELECT文でテーブル内の全レコードを表示してみましょう。
mysql> select * from DemoTable1617;
実行結果は以下の通りです。
+------------+-------------+ | Attendance | CurrentYear | +------------+-------------+ | Present | 2019 | | Absent | 2019 | | Absent | 2017 | | Present | 2019 | | Present | 2018 | | Present | 2019 | +------------+-------------+ 6 rows in set (0.00 sec)
4. 出席・欠席それぞれの人数を取得するクエリ
ここが本題です。IF()関数は条件を満たす場合に1、満たさない場合に0を返します。これをSUM()で合計することにより、各条件に該当する行数をカウントできます。
以下のクエリでは、WHERE句で「CurrentYear」が2019年のレコードに絞り込み、出席者数と欠席者数を同時に算出しています。
mysql> select sum(if(Attendance='Present',1,0)) as Present ,
-> sum(if(Attendance='Absent',1,0)) as Absent
-> from DemoTable1617
-> where CurrentYear LIKE '2019%';
実行結果は次のようになります。
+---------+--------+ | Present | Absent | +---------+--------+ | 3 | 1 | +---------+--------+ 1 row in set (0.00 sec)
まとめ
sum(if(条件, 1, 0))という書き方は、MySQLで条件別の件数を1つのクエリ内で複数同時に集計したい場合に非常に便利なテクニックです。CASE式(CASE WHEN 条件 THEN 1 ELSE 0 END)を使っても同じ結果が得られますので、用途に応じて使い分けるとよいでしょう。
-
MySQLですべてのトリガー一覧と現在のデータベースのトリガーを確認する方法
MySQLのトリガーを取得する方法MySQLでトリガーを管理する際、サーバー内に存在するすべてのトリガーを確認したいケースや、現在接続しているデータベースに限定してトリガーを確認したいケースがあります。それぞれの方法を解説します。すべてのトリガーを取得する方法MySQLサーバー上のすべてのトリガーを取得するには、information_schema.triggers テーブルを参照します。基本構文は以下の通りです。SELECT trigger_schema, trigger_name FROM information_schema.triggers;このクエリを実行すると、トリガーが属するスキ
-
MySQLで日付レコードと現在の日付の差分を取得する方法(DATEDIFF関数の使い方)
現在の日付が「2019-09-06」であると仮定して、テーブルに保存された日付レコードと現在の日付との差分(日数)を取得する方法を解説します。MySQLでは、DATEDIFF() 関数を使うことで、2つの日付の差を簡単に計算できます。 1. サンプルテーブルを作成する まず、日付型(DATE)のカラムを持つテーブルを作成します。 mysql> create table DemoTable ( AdmissionDate date ); Query OK, 0 rows affected (0.54 sec) 2. テーブルにレコードを挿入する INSERT文を使って、いくつかの日