0% completed
Problem
Table: Students
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| student_id | int |
| student_name | varchar |
+---------------+---------+
student_id is the primary key (column with unique values) for this table.
Each row of this table contains the ID and the name of one student in the school.
Table: Subjects
+--------------+---------+
| Column Name | Type |
+--------------+---------+
| subject_name | varchar |
+--------------+---------+
subject_name is the primary key (column with unique values) for this table.
Each row of this table contains the name of one subject in the school.
Table: Examinations
+--------------+---------+
| Column Name | Type |
+--------------+---------+
| student_id | int |
| subject_name | varchar |
+--------------+---------+
There is no primary key (column with unique values) for this table. It may contain duplicates.
Each student from the Students table takes every course from the Subjects table.
Each row of this table indicates that a student with ID student_id attended the exam of subject_name.
Problem Definition
Write a solution to find the number of times each student attended each exam.
Return the result table ordered by student_id
and subject_name
.
Example
Output
Try It Yourself
Solution
To solve this problem, the approach involves using SQL queries to retrieve and process information from the given tables—Students
, Subjects
, and Examinations
. The objective is to find the number of times each student attended each exam.
The initial step is to perform a CROSS JOIN
between the Students
and Subjects
tables. This operation generates a combination of all students and subjects, ensuring that each student is paired with every subject. The result of this join is then further combined with the Examinations
table using a LEFT JOIN
. The LEFT JOIN
ensures that all combinations from the previous step are retained, even if there are no matching entries in the Examinations
table.
The COUNT
function is applied to calculate the number of times each student attended each exam. The GROUP BY
clause is utilized to group the results by student_id
, student_name
, and subject_name
, allowing the counting operation to be performed on each unique combination.
The final step involves ordering the result table by student_id
and subject_name
, as specified in the problem statement. This is achieved using the ORDER BY
clause.
SELECT s.student_id, s.student_name, sub.subject_name, Count(e.student_id) AS attended_exams FROM Students s CROSS JOIN Subjects sub LEFT JOIN Examinations e ON s.student_id = e.student_id AND sub.subject_name = e.subject_name GROUP BY s.student_id, s.student_name, sub.subject_name ORDER BY s.student_id, sub.subject_name;
Let's break down the query step by step:
Step 1: Cross Join Students and Subjects
We start by performing a cross join between the Students
and Subjects
tables to generate a combination of all students and all subjects.
SELECT s.student_id, s.student_name, sub.subject_name FROM students s CROSS JOIN subjects sub;
Output After Step 1:
+------------+--------------+--------------+ | student_id | student_name | subject_name | +------------+--------------+--------------+ | 1 | Alice | Math | | 1 | Alice | Physics | | 1 | Alice | Programming | | 2 | Bob | Math | | 2 | Bob | Physics | | 2 | Bob | Programming | | 6 | Alex | Math | | 6 | Alex | Physics | | 6 | Alex | Programming | | 13 | John | Math | | 13 | John | Physics | | 13 | John | Programming | +------------+--------------+--------------+
Step 2: Left Join with Examinations
We perform a left join with the Examinations
table to find out which students attended which exams. The GROUP BY
clause is used to group data based on the student_id, s.student_name, and sub.subject_name raws.
SELECT s.student_id, s.student_name, sub.subject_name, Count(e.student_id) AS attended_exams FROM students s CROSS JOIN subjects sub LEFT JOIN examinations e ON s.student_id = e.student_id AND sub.subject_name = e.subject_name GROUP BY s.student_id, s.student_name, sub.subject_name;
Output After Step 2:
+------------+--------------+--------------+-----------------+ | student_id | student_name | subject_name | attended_exams | +------------+--------------+--------------+-----------------+ | 1 | Alice | Math | 3 | | 1 | Alice | Physics | 2 | | 1 | Alice | Programming | 1 | | 2 | Bob | Math | 1 | | 2 | Bob | Physics | 0 | | 2 | Bob | Programming | 1 | | 6 | Alex | Math | 0 | | 6 | Alex | Physics | 0 | | 6 | Alex | Programming | 0 | | 13 | John | Math | 1 | | 13 | John | Physics | 1 | | 13 | John | Programming | 1 | +------------+--------------+--------------+-----------------+
Step 3: Order by student_id and subject_name
Finally, we order the result table by student_id
and subject_name
as specified in the problem.
SELECT student_id, student_name, subject_name, attended_exams FROM ( -- Step 2 output goes here ) ORDER BY student_id, subject_name;
Final Output:
+------------+--------------+--------------+-----------------+ | student_id | student_name | subject_name | attended_exams | +------------+--------------+--------------+-----------------+ | 1 | Alice | Math | 3 | | 1 | Alice | Physics | 2 | | 1 | Alice | Programming | 1 | | 2 | Bob | Math | 1 | | 2 | Bob | Physics | 0 | | 2 | Bob | Programming | 1 | | 6 | Alex | Math | 0 | | 6 | Alex | Physics | 0 | | 6 | Alex | Programming | 0 | | 13 | John | Math | 1 | | 13 | John | Physics | 1 | | 13 | John | Programming | 1 | +------------+--------------+--------------+-----------------+
.....
.....
.....
Table of Contents
Contents are not accessible
Contents are not accessible
Contents are not accessible
Contents are not accessible
Contents are not accessible