Connect outcomes, activities and evaluations before teaching. This ABET Engineering example reports coverage, activity results, overall achievement and rubric scores. Sample names and results are fictional.
Where the data comes from: Brightspace Data Sets, the CSV extracts Brightspace publishes in Data Hub. This is not a built-in Brightspace report or screen. Rowseta syncs these data sets for you, or your administrator can download the extracts for your own SQL tool.
SQL
Run the queries
Use the Rowseta SQL editor or your own SQL tool with current Data Hub extracts. Apply differentials; remove spaces from table names. Another SQL tool may need small changes to these queries.
In Rowseta, sign in directly, select the listed data sets and sync. Course-link sessions cannot read Outcomes data sets without a course ID.
A free Rowseta Desktop app is coming soon.
Set up outcomes before assessment
ABET Engineering criteria require documented student outcomes and regular assessment and evaluation. Your program defines wording, sampling, targets and attainment. No endorsement is implied.
- Enable Learning Outcomes and a default achievement scale. Keep Competencies enabled globally for assignment rubric attachment; each course uses one framework.
- Import an organizational Outcome Set into courses. Verify shared OutcomeId values across registries; matching descriptions do not establish identity.
- Align rubric criteria and check scale mappings before assessment restricts editing. Attach rubrics to activities; discussions need a grade item or evaluated rubric. Align quiz questions, not whole quizzes.
- Publish activity feedback: drafts produce no demonstrations. Check known learners with faculty; record Mastery View's calculation method.
Mistakes that leave gaps
Use this table for incomplete results. Missing evidence does not mean failure.
| Check | Why it matters |
|---|---|
| Rubric attached only to a grade item | It does not appear in Mastery View. Attach it to an assessment activity. |
| Missing alignment or draft feedback | Alignment must precede assessment; activity feedback must be published. |
| Changed default scale | Earlier-scale evaluations are excluded from overall suggestions and evidence trends. |
| Outcomes switched off and on | Extracts may contain missing or unexpected data. |
| Content-only alignment | Content coverage supplies no assessed level. |
Select the data sets
Each row lists required data sets. Demonstrations use RegistryId for courses. Queries exclude deleted parents/children; Rowseta preserves deleted records.
Course-to-outcome coverage
Set the course on line 2. Unaligned outcomes remain visible. Type 3 alignment IDs can identify questions, not attempts.
WITH Settings AS (
SELECT 100 AS CourseId
)
SELECT c.Name AS Course,c.OrgUnitId AS CourseId,o.Notation,o.OutcomeId,o.Description,
a.ObjectType,a.ObjectId
FROM OutcomesSetCourse s
JOIN OrganizationalUnits c ON c.OrgUnitId=s.OrgUnitId
JOIN Settings p ON p.CourseId=c.OrgUnitId
JOIN OutcomesInRegistries r ON r.RegistryId=s.RegistryId
JOIN OutcomeDetails o ON o.OutcomeId=r.OutcomeId
LEFT JOIN OutcomesAlignedToToolObjects a
ON a.RegistryId=r.RegistryId AND a.OutcomeId=r.OutcomeId
AND TRY_CAST(a.IsDeleted AS BOOLEAN) IS NOT TRUE
WHERE TRY_CAST(s.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(c.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(r.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(o.IsDeleted AS BOOLEAN) IS NOT TRUE
ORDER BY c.Name,c.OrgUnitId,o.Notation,o.OutcomeId,a.ObjectType,a.ObjectId| Course | CourseId | Notation | OutcomeId | Description | ObjectType | ObjectId |
|---|---|---|---|---|---|---|
| Fictional course 100 | 100 | SO1 | o1 | Solve complex engineering problems | 2 | 1000 |
| Fictional course 100 | 100 | SO1 | o1 | Solve complex engineering problems | 2 | 1004 |
| Fictional course 100 | 100 | SO1 | o1 | Solve complex engineering problems | 3 | question1002 |
| Fictional course 100 | 100 | SO1 | o2 | Solve complex engineering problems | 2 | 1000 |
First 4 rows shown.
The remaining sample includes SO6 without evaluation and SO7 without alignment. Neither proves teaching coverage.
Results by outcome, course and assessment
Set UTC start on line 2, exclusive end on line 3, course on line 4 and target levels on line 5. Initial AssessedDate includes start, excludes end. Neither SortOrder nor nullable percentage bounds establish attainment.
WITH Settings AS (
SELECT TIMESTAMPTZ '2026-09-01 00:00:00+00' AS StartUTC,
TIMESTAMPTZ '2027-01-01 00:00:00+00' AS EndUTC,
100 AS CourseId,
['Proficient', 'Advanced'] AS TargetLevels
), Evaluations AS (
SELECT d.*,s.OrgUnitId,c.Name AS Course,o.Notation,
l.Name AS Level,l.ScaleLevelId
FROM OutcomesDemonstrations d
JOIN OutcomesSetCourse s ON s.RegistryId=d.RegistryId
JOIN OrganizationalUnits c ON c.OrgUnitId=s.OrgUnitId
JOIN Settings p ON p.CourseId=c.OrgUnitId
JOIN OutcomesInRegistries r ON r.RegistryId=d.RegistryId AND r.OutcomeId=d.OutcomeId
JOIN OutcomeDetails o ON o.OutcomeId=r.OutcomeId
JOIN OutcomesScaleLevelDefinition l
ON l.ScaleLevelId=COALESCE(d.ExplicitlyEnteredScaleLevelId,d.AutomaticallyGeneratedScaleLevelId)
JOIN OutcomesScaleDefinition z ON z.ScaleId=l.ScaleId
WHERE d.AlignedObjectType IN (1, 2, 3)
AND d.AssessedDate>=p.StartUTC AND d.AssessedDate<p.EndUTC
AND TRY_CAST(d.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(s.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(c.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(r.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(o.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(z.IsDeleted AS BOOLEAN) IS NOT TRUE
), NamedEvaluations AS (
SELECT e.*,a.Name AS Assessment,a.DropboxId AS AssessmentId
FROM Evaluations e JOIN AssignmentSummary a
ON e.AlignedObjectType=2 AND TRY_CAST(e.AlignedObjectId AS BIGINT)=a.DropboxId
AND e.OrgUnitId=a.OrgUnitId
WHERE TRY_CAST(a.IsDeleted AS BOOLEAN) IS NOT TRUE
UNION ALL
SELECT e.*,t.Name AS Assessment,t.TopicId AS AssessmentId
FROM Evaluations e JOIN DiscussionTopics t
ON e.AlignedObjectType=1 AND TRY_CAST(e.AlignedObjectId AS BIGINT)=t.TopicId
AND e.OrgUnitId=t.OrgUnitId
WHERE TRY_CAST(t.IsDeleted AS BOOLEAN) IS NOT TRUE
UNION ALL
SELECT e.*,q.QuizName AS Assessment,q.QuizId AS AssessmentId
FROM Evaluations e JOIN QuizAttempts a
ON e.AlignedObjectType=3 AND TRY_CAST(e.AlignedObjectId AS BIGINT)=a.AttemptId
AND e.OrgUnitId=a.OrgUnitId AND e.AssessedUserId=a.UserId
JOIN QuizObjects q ON q.QuizId=a.QuizId AND q.OrgUnitId=a.OrgUnitId
WHERE TRY_CAST(a.IsDeleted AS BOOLEAN) IS NOT TRUE
)
SELECT MIN(e.Notation) AS Notation,e.OutcomeId, MIN(e.Course) AS Course,e.OrgUnitId AS CourseId,
MIN(e.Assessment) AS Assessment,e.AlignedObjectType AS AssessmentType,e.AssessmentId,
MIN(e.Level) AS Level,e.ScaleLevelId,
COUNT(DISTINCT e.AssessedUserId) AS Learners,
COUNT(*) AS Evaluations,
COUNT(DISTINCT CASE WHEN list_contains(p.TargetLevels,e.Level) THEN e.AssessedUserId END) AS MeetingTarget
FROM NamedEvaluations e CROSS JOIN Settings p
GROUP BY e.OutcomeId,e.OrgUnitId,e.AlignedObjectType,e.AssessmentId,e.ScaleLevelId
ORDER BY Notation, OutcomeId, Course, CourseId,
Assessment, AssessmentType, AssessmentId, Level, ScaleLevelId| Notation | OutcomeId | Course | CourseId | Assessment | AssessmentType | AssessmentId | Level | ScaleLevelId | Learners | Evaluations | MeetingTarget |
|---|---|---|---|---|---|---|---|---|---|---|---|
| SO1 | o1 | Fictional course 100 | 100 | Design quiz | 3 | 1002 | Advanced | l4 | 50 | 51 | 50 |
| SO1 | o1 | Fictional course 100 | 100 | Design quiz | 3 | 1002 | Beginning | l1 | 50 | 50 | 0 |
| SO1 | o1 | Fictional course 100 | 100 | Design task | 2 | 1000 | Advanced | l4 | 1 | 1 | 1 |
| SO1 | o1 | Fictional course 100 | 100 | Design task | 2 | 1000 | Proficient | l3 | 49 | 49 | 49 |
First 4 rows shown.
Never sum level-row learners: the same 50 appear at two levels, with 51 Advanced evaluations. Manual levels override suggestions. Attempts resolve QuizId by course and learner. Missing levels/activities, portfolio evidence and type 4 checkpoints are excluded.
Overall achievement from Mastery View
Set UTC start on line 2, exclusive end on line 3 and course on line 4. Join type 4 checkpoints by both checkpoint and demonstration IDs to avoid duplication.
WITH Settings AS (
SELECT TIMESTAMPTZ '2026-09-01 00:00:00+00' AS StartUTC,
TIMESTAMPTZ '2027-01-01 00:00:00+00' AS EndUTC,
100 AS CourseId
)
SELECT MIN(o.Notation) AS Notation,o.OutcomeId, MIN(c.Name) AS Course,c.OrgUnitId AS CourseId,
MIN(l.Name) AS Level,l.ScaleLevelId,
COUNT(DISTINCT d.AssessedUserId) AS Learners,
COUNT(*) AS Checkpoints,
COUNT(DISTINCT CASE WHEN TRY_CAST(k.HasMetAchievementThreshold AS BOOLEAN) IS TRUE THEN d.AssessedUserId END) AS ThresholdMet
FROM OutcomesDemonstrations d
JOIN OutcomesAssessedCheckpoints k
ON CAST(d.AlignedObjectId AS VARCHAR)=CAST(k.CheckpointId AS VARCHAR)
AND CAST(d.DemonstrationId AS VARCHAR)=CAST(k.DemonstrationId AS VARCHAR)
JOIN OutcomesSetCourse s ON s.RegistryId=d.RegistryId
JOIN OrganizationalUnits c ON c.OrgUnitId=s.OrgUnitId
JOIN Settings p ON p.CourseId=c.OrgUnitId
JOIN OutcomesInRegistries r ON r.RegistryId=d.RegistryId AND r.OutcomeId=d.OutcomeId
JOIN OutcomeDetails o ON o.OutcomeId=r.OutcomeId
JOIN OutcomesScaleLevelDefinition l
ON l.ScaleLevelId=COALESCE(d.ExplicitlyEnteredScaleLevelId,d.AutomaticallyGeneratedScaleLevelId)
JOIN OutcomesScaleDefinition z ON z.ScaleId=l.ScaleId
WHERE d.AlignedObjectType=4
AND d.AssessedDate>=p.StartUTC AND d.AssessedDate<p.EndUTC
AND TRY_CAST(d.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(k.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(s.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(c.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(r.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(o.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(z.IsDeleted AS BOOLEAN) IS NOT TRUE
GROUP BY o.OutcomeId,c.OrgUnitId,l.ScaleLevelId
ORDER BY Notation, OutcomeId, Course, CourseId, Level, ScaleLevelId| Notation | OutcomeId | Course | CourseId | Level | ScaleLevelId | Learners | Checkpoints | ThresholdMet |
|---|---|---|---|---|---|---|---|---|
| SO1 | o1 | Fictional course 100 | 100 | Proficient | l3 | 50 | 50 | 50 |
| SO1 | o2 | Fictional course 100 | 100 | Proficient | l3 | 1 | 1 | 1 |
| SO3 | o3 | Fictional course 100 | 100 | Developing | l2 | 50 | 50 | 0 |
Retain dated evidence; current values cannot reconstruct term-end history. IsPublished is independent of activity feedback, so unpublished checkpoints count. Cleared levels are excluded. ThresholdMet is D2L's threshold, not ABET's.
Rubric scores as supporting evidence
Set UTC start on line 2 and exclusive end on line 3, using AssessmentDate. Criteria lack user/activity keys: count live completed assessments by AssessmentId and RubricId before filtering dates. Exclude ambiguous pairs: two pairs, four assessments here.
WITH Settings AS (
SELECT TIMESTAMPTZ '2026-09-01 00:00:00+00' AS StartUTC,
TIMESTAMPTZ '2027-01-01 00:00:00+00' AS EndUTC
), Completed AS (
SELECT a.* FROM RubricAssessment a
WHERE TRY_CAST(a.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(a.IsCompleted AS BOOLEAN) IS TRUE
), Matches AS (
SELECT a.AssessmentId,a.RubricId, COUNT(*) AS Matches
FROM Completed a GROUP BY a.AssessmentId,a.RubricId
)
SELECT MIN(c.Name) AS Course,c.OrgUnitId AS CourseId, MIN(o.Notation) AS Notation,o.OutcomeId,
MIN(b.Name) AS Criterion,b.CriterionId, MIN(l.Name) AS RubricLevel,l.LevelId,
COUNT(DISTINCT a.UserId) AS Learners, COUNT(DISTINCT a.AssessmentId) AS Assessments,
CAST(AVG(x.Score) AS DOUBLE) AS MeanScore
FROM Completed a
JOIN Matches m ON m.AssessmentId=a.AssessmentId AND m.RubricId=a.RubricId AND m.Matches=1
JOIN RubricAssessmentCriteria x ON x.AssessmentId=a.AssessmentId AND x.RubricId=a.RubricId
JOIN RubricObjects z ON z.RubricId=a.RubricId
JOIN RubricObjectCriteria b ON b.RubricId=x.RubricId AND b.CriterionId=x.CriterionId
JOIN RubricObjectLevels l ON l.RubricId=x.RubricId AND l.LevelId=x.LevelAchievedId
JOIN OutcomesRubricAlignments v ON v.RubricId=x.RubricId AND v.CriterionId=x.CriterionId
JOIN OutcomesSetCourse s ON s.RegistryId=v.RegistryId AND s.OrgUnitId=a.OrgUnitId
JOIN OutcomesInRegistries r ON r.RegistryId=s.RegistryId AND r.OutcomeId=v.OutcomeId
JOIN OutcomeDetails o ON o.OutcomeId=r.OutcomeId
JOIN OrganizationalUnits c ON c.OrgUnitId=a.OrgUnitId
CROSS JOIN Settings p
WHERE a.AssessmentDate>=p.StartUTC AND a.AssessmentDate<p.EndUTC
AND TRY_CAST(z.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(b.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(l.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(v.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(s.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(r.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(o.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(c.IsDeleted AS BOOLEAN) IS NOT TRUE
GROUP BY c.OrgUnitId,o.OutcomeId,b.CriterionId,l.LevelId
ORDER BY Course, CourseId, Notation, OutcomeId, Criterion, CriterionId, RubricLevel, LevelId| Course | CourseId | Notation | OutcomeId | Criterion | CriterionId | RubricLevel | LevelId | Learners | Assessments | MeanScore |
|---|---|---|---|---|---|---|---|---|---|---|
| Fictional course 100 | 100 | SO1 | o1 | Reasoning | 1 | Sound reasoning | 1 | 1 | 1 | 8 |
| Fictional course 100 | 100 | SO1 | o1 | Reasoning | 3 | Sound reasoning | 1 | 1 | 1 | 6 |
| Fictional course 100 | 101 | SO1 | o1 | Reasoning | 1 | Sound reasoning | 1 | 1 | 1 | 8 |
Course matching prevents duplication. IDs separate matching names. Scores are not outcome levels. Incomplete assessments and ambiguous pairs are excluded; Written Response question assessments are absent.
Optional: learner results for internal follow-up
Accreditation uses aggregated outcome/course results; learner results are optional internal follow-up. Set program courses on line 4, UTC bounds on line 2 and line 3; activity exclusions apply.
WITH Settings AS (
SELECT TIMESTAMPTZ '2026-09-01 00:00:00+00' AS StartUTC,
TIMESTAMPTZ '2027-01-01 00:00:00+00' AS EndUTC,
[100, 101] AS ProgramCourseIds
), Evaluations AS (
SELECT d.*,s.OrgUnitId,o.Notation,l.Name AS Level
FROM OutcomesDemonstrations d
JOIN OutcomesSetCourse s ON s.RegistryId=d.RegistryId
JOIN OrganizationalUnits c ON c.OrgUnitId=s.OrgUnitId
JOIN Settings p ON list_contains(p.ProgramCourseIds,c.OrgUnitId)
JOIN OutcomesInRegistries r ON r.RegistryId=d.RegistryId AND r.OutcomeId=d.OutcomeId
JOIN OutcomeDetails o ON o.OutcomeId=r.OutcomeId
JOIN OutcomesScaleLevelDefinition l
ON l.ScaleLevelId=COALESCE(d.ExplicitlyEnteredScaleLevelId,d.AutomaticallyGeneratedScaleLevelId)
JOIN OutcomesScaleDefinition z ON z.ScaleId=l.ScaleId
WHERE d.AlignedObjectType IN (1, 2, 3)
AND d.AssessedDate>=p.StartUTC AND d.AssessedDate<p.EndUTC
AND TRY_CAST(d.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(s.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(c.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(r.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(o.IsDeleted AS BOOLEAN) IS NOT TRUE
AND TRY_CAST(z.IsDeleted AS BOOLEAN) IS NOT TRUE
), NamedEvaluations AS (
SELECT e.*
FROM Evaluations e JOIN AssignmentSummary a
ON e.AlignedObjectType=2 AND TRY_CAST(e.AlignedObjectId AS BIGINT)=a.DropboxId
AND e.OrgUnitId=a.OrgUnitId
WHERE TRY_CAST(a.IsDeleted AS BOOLEAN) IS NOT TRUE
UNION ALL
SELECT e.*
FROM Evaluations e JOIN DiscussionTopics t
ON e.AlignedObjectType=1 AND TRY_CAST(e.AlignedObjectId AS BIGINT)=t.TopicId
AND e.OrgUnitId=t.OrgUnitId
WHERE TRY_CAST(t.IsDeleted AS BOOLEAN) IS NOT TRUE
UNION ALL
SELECT e.*
FROM Evaluations e JOIN QuizAttempts a
ON e.AlignedObjectType=3 AND TRY_CAST(e.AlignedObjectId AS BIGINT)=a.AttemptId
AND e.OrgUnitId=a.OrgUnitId AND e.AssessedUserId=a.UserId
JOIN QuizObjects q ON q.QuizId=a.QuizId AND q.OrgUnitId=a.OrgUnitId
WHERE TRY_CAST(a.IsDeleted AS BOOLEAN) IS NOT TRUE
)
SELECT u.UserId, MIN(u.FirstName || ' ' || u.LastName) AS Learner,
e.OutcomeId, MIN(e.Notation) AS Notation,
COUNT(DISTINCT e.OrgUnitId) AS Courses, COUNT(*) AS Demonstrations,
arg_max(e.Level, (e.AssessedDate,e.DemonstrationId)) AS LatestLevel
FROM NamedEvaluations e JOIN Users u ON u.UserId=e.AssessedUserId
WHERE u.DateDeleted IS NULL
GROUP BY u.UserId,e.OutcomeId
ORDER BY u.UserId,e.OutcomeId| UserId | Learner | OutcomeId | Notation | Courses | Demonstrations | LatestLevel |
|---|---|---|---|---|---|---|
| 1 | Fictional Learner 1 | o1 | SO1 | 2 | 5 | Proficient |
| 1 | Fictional Learner 1 | o3 | SO3 | 1 | 1 | Developing |
| 2 | Fictional Learner 1 | o1 | SO1 | 1 | 4 | Proficient |
| 2 | Fictional Learner 1 | o2 | SO1 | 1 | 1 | Proficient |
| 2 | Fictional Learner 1 | o3 | SO3 | 1 | 1 | Developing |
First five rows. User 1 spans two program courses; excludes course 102. IDs separate names. LatestLevel uses assessment date, then demonstration ID for ties, independently of Mastery View.
What these reports cannot prove
These reports cannot establish major, cohort, course emphasis or consistent faculty judgment. Define sampling and interpret evidence separately.
They cannot reveal draft activity feedback, reconstruct past overall achievement or resolve quiz-question names through these joins. Records generally start June 2021 for authored outcomes, course-owned registries, alignments and demonstrations; July 2021 for checkpoint settings; May 2023 for course-specific scales. Exceptions: scales from first use, earlier ASN outcomes and program registries. Outcomes Set Course predates November 2025, with null creator/modifier fields before then.
Sources
Checked November 6, 2026; follow current instructions.
When it goes wrong
| What you see | What to do |
|---|---|
| Outcomes queries return no rows from a course link | Sign in directly. Course-link sessions cannot read Outcomes data sets without OrgUnitId. |
| A listed data set or the SQL editor is missing | Select the listed data sets in Manage data sets and complete a sync. |
| Rubric scores exist but outcome results are missing | Check alignment and published feedback, then inspect completed rubric assessments and ambiguity exclusions. |