I have this query that works well in Moodle 3.1 for identifying the Course, Student Name, Start Date of the Course, Last Access, Days Since Last Access, Activities Completed, Activities Assigned, % of Course Completed, Quality of Work to Date, and Final Score for the Course to date. I'd like to add fields for Date of Last Submission and Days Since Last Submission and I'm not very good with SQL.
The Date of Last Submission should be based on the date of submission of a quiz, forum post, or assignment submission whichever is latest. The submission must be by the Student and not be the result of an instructor submitting feedback. The Days Since Last Submission should be calculated counting the day the report is run (ex. Date of Last Submission 2/3/2017 and today's date of 2/4/2017 would result in a 1 for the Days Since Last Submission field).
Any help is much appreciated.
----
SELECT c.fullname AS 'Course'
,
u.firstname AS 'First Name'
,
u.lastname AS 'Last Name'
,
FROM_UNIXTIME(c.startdate, '%m/%d/%Y') AS 'Start Date'
,
IFNULL((SELECT DATE_FORMAT(FROM_UNIXTIME(la.timeaccess),
'%m/%d/%Y')
FROM prefix_user_lastaccess la
WHERE la.userid=u.id
AND la.courseid=c.id),'Never') AS 'Last Access'
,
IFNULL((SELECT DATEDIFF( NOW(),FROM_UNIXTIME(la.timeaccess))
FROM prefix_user_lastaccess la
WHERE la.userid=u.id
AND la.courseid=c.id),'Never') AS 'Days since last accessed'
,
IFNULL((SELECT COUNT(gg.finalgrade)
FROM
prefix_grade_grades AS gg
JOIN
prefix_grade_items AS gi ON gg.itemid=gi.id
WHERE
gi.courseid=c.id
AND gg.userid=u.id
AND
gi.itemtype='mod'
GROUP BY
u.id,c.id),'0') AS 'Activities Completed'
,
IFNULL((SELECT COUNT(gi.itemname)
FROM
prefix_grade_items AS gi
WHERE gi.courseid =
c.id
AND
gi.itemtype='mod'), '0') AS 'Activities Assigned'
,
/*If Activities completed = activities assigned, show date
of last log entry. Otherwise, show percentage complete. If Activities Assigned
= 0, show 'n/a'.--*/
(SELECT IF(`Activities Assigned`!='0', (SELECT
IF((`Activities Completed`)=(`Activities Assigned`),
/*--Last log entry--*/
(SELECT CONCAT('100% completed
',FROM_UNIXTIME(MAX(log.TIME),'%m/%d/%Y'))
FROM prefix_log log
WHERE log.course=c.id
AND log.userid=u.id),
/*--Percent completed--*/
(SELECT CONCAT(IFNULL(ROUND((`Activities
Completed`)/(`Activities Assigned`)*100,0), '0'),'% complete')))), 'n/a')) AS
'% of Course Completed'
,
IFNULL(CONCAT(ROUND((SELECT (IFNULL((SELECT
SUM(gg.finalgrade)
FROM
prefix_grade_grades AS gg
JOIN
prefix_grade_items AS gi ON gi.id=gg.itemid
WHERE
gg.itemid=gi.id
AND
gi.courseid=c.id
AND
gi.itemtype='mod'
AND gg.userid=u.id
GROUP BY
u.id,c.id),0)/(SELECT SUM(gi.grademax)
FROM
prefix_grade_items AS gi
JOIN
prefix_grade_grades AS gg ON gi.id=gg.itemid
WHERE
gg.itemid=gi.id
AND
gi.courseid=c.id
AND
gi.itemtype='mod'
AND gg.userid=u.id
AND gg.finalgrade
IS NOT NULL
GROUP BY
u.id,c.id))*100),0),'%'),'n/a')
AS 'Quality of Work
to Date',
(SELECT
IF(`Activities
Assigned`!='0',
CONCAT(IFNULL(ROUND(((SELECT gg.finalgrade/gi.grademax
)*100),0),'0'),'%', ' (', ROUND(gg.finalgrade,0), ' / ',
ROUND(gi.grademax,0), ') '),'n/a')
FROM
prefix_grade_items AS gi
JOIN
prefix_grade_grades AS gg ON gg.itemid=gi.id
WHERE
gi.courseid=c.id
AND gg.userid=u.id
AND
gi.itemtype='course'
GROUP BY
'gi.courseid') AS 'Final Score (incl xtra credit)'
/*FROM prefix_user u
JOIN prefix_user_enrolments ue ON ue.userid = u.id
JOIN prefix_role_assignments as ra ON ra.userid = ue.userid
JOIN prefix_context AS ctx ON ctx.id = ra.contextid
JOIN prefix_enrol e ON e.courseid = ctx.instanceid
JOIN prefix_course c ON c.id = e.courseid
###JOIN prefix_user_lastaccess AS la ON. la.courseid = c.id
FROM prefix_course c
JOIN prefix_context ctx on c.id = ctx.instanceid
JOIN prefix_role_assignments ra ON ctx.id = ra.contextid
JOIN prefix_user u ON u.id =
ra.userid
JOIN prefix_user_enrolments ue ON ue.userid = ra.userid*/
FROM prefix_user_enrolments ue
JOIN prefix_enrol e ON e.id = ue.enrolid
JOIN prefix_course c on e.courseid = c.id
JOIN prefix_user u on ue.userid = u.id
WHERE (
c.startdate> UNIX_TIMESTAMP(NOW() - INTERVAL 5 WEEK))
AND c.fullname NOT LIKE 'College Prep%'
#AND ra.userid=u.id
#AND ctx.instanceid=c.id
AND ue.status='0' ### "0" FOR active,
"1" FOR suspended. Leave commented OUT TO include BOTH.
#AND ra.roleid='5' ### "5" = student
AND c.visible='1' ### "1" FOR course visible,
"0" FOR hidden
GROUP BY u.id, c.id
ORDER BY c.fullname, u.lastname, u.firstname