前提・実現したいこと
SQL初学者です。
MySQLのサンプルデータベースのひとつであるEmployeesを用いて勉強をしています。
exists文を使って部署(dept_name)毎に現在(to_date="9999-01-01")titleがStaffである人数を集計せよ、という問題を解きたいのですが、existsの使い方がいまいちわかっていないこともあってどのようなSQL文を書けばよいのかわかりません。
内部結合を用いて集計することはできたのですが…(試したことの欄で後述します)
使うテーブル
titlesテーブルとdept_empテーブルはそれぞれ443308レコード、331603レコードあってすべてのレコードをINSERT文の中に記述することはできないため、5レコードのみ記載します。
#####titles
SQL
1CREATE TABLE "titles" 2( 3 "emp_no" INT(11) PRIMARY KEY, 4 "title" VARCHAR(50) PRIMARY KEY, 5 "from_date" DATE PRIMARY KEY, 6 "to_date" DATE 7) 8 9INSERT INTO "titles" 10 ("emp_no", "title", "from_date", "to_date") 11VALUES 12 (10001, "Senior Engineer", "1986-06-26", "9999-01-01"), 13 (10002, "Staff", "1996-08-03", "9999-01-01"), 14 (10003, "Senior Engineer", "1995-12-03", "9999-01-01"), 15 (10004, "Engineer", "1986-12-01", "1995-12-01"), 16 (10004, "Staff", "1995-12-01", "9999-01-01") 17
dept_emp
SQL
1CREATE TABLE "dept_emp" 2( 3 "emp_no" INT(11) PRIMARY KEY, 4 "dept_no" CHAR(4) PRIMARY KEY, 5 "from_date" DATE, 6 "to_date" DATE 7) 8 9INSERT INTO "dept_emp" 10 ("emp_no", "dept_no", "from_date", "to_date") 11VALUES 12 (10001, "d005", "1986-06-26", "9999-01-01"), 13 (10002, "d007", "1996-08-03", "9999-01-01"), 14 (10003, "d004", "1995-12-03", "9999-01-01"), 15 (10004, "d004", "1986-12-01", "1995-12-01"), 16 (10005, "d003", "1989-09-12", "9999-01-01");
departments
SQL
1CREATE TABLE "departments" 2( 3 "dept_no" CHAR(4) PRIMARY KEY, 4 "dept_name" VARCHAR(40) UNIQUE 5) 6 7INSERT INTO "departments" 8 ("dept_no","dept_name") 9VALUES 10 ("d001", "Marketing"), 11 ("d002", "Finance"), 12 ("d003", "Human Resources"), 13 ("d004", "Production"), 14 ("d005", "Development"), 15 ("d006", "Quality Management"), 16 ("d007", "Sales"), 17 ("d008", "Research"), 18 ("d009", "Customer Service");
試したこと
内部結合を用いた集計を行うことには(おそらく)成功しました。
SQL
1SELECT dept_name, COUNT(*) AS num 2FROM 3 (SELECT a.emp_no, a.title, a.to_date, c.dept_name 4 FROM titles a 5 INNER JOIN dept_emp b 6 ON a.emp_no=b.emp_no 7 INNER JOIN departments c 8 ON b.dept_no=c.dept_no) joined 9WHERE title="Staff" AND to_date="9999-01-01" 10GROUP BY dept_name 11ORDER BY dept_name;
実行結果
dept_name | num |
---|---|
Customer Service | 3902 |
Development | 315 |
Finance | 3199 |
Human Resources | 3416 |
Marketing | 3880 |
Production | 349 |
Research | 3206 |
Sales | 9967 |
補足情報(FW/ツールのバージョンなど)
-> % mysql --version
mysql Ver 8.0.13 for osx10.14 on x86_64 (Homebrew)
初質問なので不足している情報等あってご迷惑をおかけするかもしれませんが、よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー