'How to find number of entries grouped by something and retrieve only those above average?
I have two tables: Profile and Record. In Profile, I have student names and other information, whereas, in Record, I have rows with curriculum information. In the Record table, a single student can have many rows. I need to calculate the number of rows grouped by student_name, but only retrieve those student names with more rows than the average (number of rows/total number of students). I can find the number of rows grouped by student_name, but I can't write a subquery to display only those above average. Could someone please explain a method to me?
This is what I have for now:
SELECT student_name, COUNT(*)
FROM Profile p
JOIN Record r
ON p._id = r._id
GROUP BY student_name
The desired output is only to retrieve students_name with the above avg no. of rows in the Records table:
| student_name | No. of Records |
|---|---|
| Ali | 556 |
| John | 244 |
Solution 1:[1]
Indeed you can use sub-query to get your desired output.
Code:
SELECT student, COUNT(*) AS no_of_records
FROM record
GROUP BY student
HAVING no_of_records > (SELECT COUNT(*)/COUNT(DISTINCT student) FROM record);
Explanation:
- The
sub-queryhere will return average row count from record table - In the
outer-query, we are calculating number of rows for each student and comparing it with sub-query's result
Note: You can join it with profile table in outer query if needed.
Look at the fiddle to understand it better
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Arun |
