SQL> CREATE TABLE marks ( `student` VARCHAR(17) `grade` TINYINT UNSIGNED ); SQL> INSERT INTO marks VALUES ('Alena', 6), ('Milva', 4), ('Marino', 5), ('Pablo', 5), ('Leo', 6); INSERT INTO marks VALUES ('Alena', 5), ('Milva', 4), ('Pablo', 6), ('Leo', 2); INSERT INTO marks VALUES ('Alena', 4), ('Milva', 3), ('Marino', 6), ('Pablo', 5), ('Leo', 4); SQL> SELECT * FROM marks; SQL> DELIMITER // SQL> CREATE AGGREGATE FUNCTION agg_count(x INT) RETURNS INT BEGIN DECLARE count_students INT DEFAULT 0; DECLARE CONTINUE HANDLER FOR NOT FOUND RETURN count_students; LOOP FETCH GROUP NEXT ROW; IF x THEN SET count_students = count_students + 1; END IF; END LOOP; END; // SQL> DELIMITER ; SQL> SELECT student, agg_count(5) AS 'tests' FROM marks GROUP BY student; +---------+-------+ | student | tests | +---------+-------+ | Alena | 3 | | Leo | 3 | | Marino | 2 | | Milva | 3 | | Pablo | 3 | +---------+-------+