I'm working on the following user table, where role = 2 means the user is an instructor, and role = 3 means that the user is a student.
+--------+------+---------------+
| name | role | creation_date |
+--------+------+---------------+
| Tom | 2 | 2020-07-01 |
| Diana | 3 | 2020-07-01 |
| Rachel | 3 | 2020-07-01 |
| Michel | 3 | 2020-08-01 |
+--------+------+---------------+
My goal is to select the sum value of all instructors and students, grouped by date. The result should look like this:
+------------------+---------------+---------------+
| totalInstructors | totalStudents | creation_date |
+------------------+---------------+---------------+
| 1 | 2 | 2020-07-01 |
| 0 | 1 | 2020-08-01 |
+------------------+---------------+---------------+
In this case, on 2020-07-01, I had 1 instructor and 2 students registered and on 2020-08-01, I had no instructors and I had 1 student registered.
My problem is that I am having difficulties in setting up this query, if someone can help me thank you very much!
You would need count with a case statement as follows
select count(case when role=2 then 1 end) as totalInstructors
,count(case when role=3 then 1 end) as totalStudents
,creation_date
from tbl
group by creation_date
A simple GRoupBY and SUM helps
This works. because the compasison role = 2 gives 1 back it it tue and 0 if it is false
CREATE TABLE table1 ( `name` VARCHAR(6), `role` INTEGER, `creation_date` VARCHAR(10) ); INSERT INTO table1 (`name`, `role`, `creation_date`) VALUES ('Tom', '2', '2020-07-01'), ('Diana', '3', '2020-07-01'), ('Rachel', '3', '2020-07-01'), ('Michel', '3', '2020-08-01');
SELECT SUM(`role` = 2) totalInstructors , SUM(`role` = 3) totalStudents, `creation_date` FROM table1 GROUP BY `creation_date` ORDER BY `creation_date`totalInstructors | totalStudents | creation_date ---------------: | ------------: | :------------ 1 | 2 | 2020-07-01 0 | 1 | 2020-08-01
db<>fiddle here