Reputation: 167
I am trying to sum the "Total Inservice Hours" for each user, but I am getting "Error Code: 1111. Invalid use of group function" with all my attempts. One attempt was wrapping a SUM() around the "Total Inservice Hours" field, then grouping by u.id.
Here is my SQL:
SELECT u.id,"Name",
atstat.grade,IFNULL(c.total_ceus,0) as max_ceus,c.id as courseid,atsess.id as sessid, count(c.total_ceus) as numsess, IFNULL(ROUND(((SUM(grade)/count(c.total_ceus))*total_ceus)/100,2),0) as "Total Inservice Hours"
FROM mdl_user u,mdl_course c
JOIN mdl_course_modules cm ON c.id = cm.course
JOIN mdl_attendance_sessions atsess ON cm.instance = atsess.attendanceid
JOIN mdl_attendance_log atlog ON atlog.sessionid = atsess.id
JOIN mdl_attendance_statuses atstat ON atstat.id = atlog.statusid
WHERE u.id = atlog.studentid AND (u.id = 3882) AND c.total_ceus > 0
GROUP by u.id,c.id
ORDER BY u.id DESC LIMIT 300
Here is the result of that query:
I tried to GROUP BY u.id, but I got this result:
The only field I really care about is u.id and Total Inservice Hours. The rest are just there for debugging.
Desired output would be the sum of Total Inservice Hours, which would be 111 in this example.
Thanks!
Edit: Invalid use of group function error SQL:
SELECT u.id,"Name",
atstat.grade,IFNULL(c.total_ceus,0) as max_ceus,c.id as courseid,atsess.id as sessid, count(c.total_ceus) as numsess, SUM(IFNULL(ROUND(((SUM(grade)/count(c.total_ceus))*total_ceus)/100,2),0)) as "Total Inservice Hours"
FROM mdl_user u,mdl_course c
JOIN mdl_course_modules cm ON c.id = cm.course
JOIN mdl_attendance_sessions atsess ON cm.instance = atsess.attendanceid
JOIN mdl_attendance_log atlog ON atlog.sessionid = atsess.id
JOIN mdl_attendance_statuses atstat ON atstat.id = atlog.statusid
WHERE u.id = atlog.studentid AND (u.id = 3882) AND c.total_ceus > 0
GROUP by u.id
ORDER BY u.id DESC LIMIT 300
Upvotes: 0
Views: 110
Reputation: 780724
You can't wrap one aggregate function around another.
You need to put your original query in a subquery, in order to sum one of its columns. And since you're only interested in the ID and Total Inservice Hours, you can leave out the other SELECT
columns.
SELECT id, SUM(`Total Inservice Hours`) AS "Total Inservice Hours"
FROM (SELECT u.id, IFNULL(ROUND(((SUM(grade)/count(c.total_ceus))*total_ceus)/100,2),0) as "Total Inservice Hours"
FROM mdl_user u,mdl_course c
JOIN mdl_course_modules cm ON c.id = cm.course
JOIN mdl_attendance_sessions atsess ON cm.instance = atsess.attendanceid
JOIN mdl_attendance_log atlog ON atlog.sessionid = atsess.id
JOIN mdl_attendance_statuses atstat ON atstat.id = atlog.statusid
WHERE u.id = atlog.studentid AND (u.id = 3882) AND c.total_ceus > 0
GROUP by u.id,c.id
ORDER BY u.id DESC LIMIT 300) AS subq
GROUP BY id
Upvotes: 2