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.

  1. Enable Learning Outcomes and a default achievement scale. Keep Competencies enabled globally for assignment rubric attachment; each course uses one framework.
  2. Import an organizational Outcome Set into courses. Verify shared OutcomeId values across registries; matching descriptions do not establish identity.
  3. 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.
  4. Publish activity feedback: drafts produce no demonstrations. Check known learners with faculty; record Mastery View's calculation method.
Steps before you can report on ABET outcomes Set up the Outcomes tool in Brightspace, link outcomes to rubrics and activities, then grade and publish feedback. Get the outcomes and rubric data sets through Rowseta sync or a Data Hub download, then run the queries. 1 Set up the Outcomes tool in Brightspace 2 Link outcomes to rubrics and activities 3 Grade and publish feedback 4 Get the outcomes and rubric data sets Rowseta syncs them, or download them from Data Hub 5 Run the queries
The Brightspace setup that must happen before outcome data exists, then the data sets and queries.

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.

Course-to-outcome coverage

Set the course on line 2. Unaligned outcomes remain visible. Type 3 alignment IDs can identify questions, not attempts.

sql
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.

sql
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.

sql
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.

sql
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.

sql
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.

When it goes wrong

What you seeWhat to do
Outcomes queries return no rows from a course linkSign in directly. Course-link sessions cannot read Outcomes data sets without OrgUnitId.
A listed data set or the SQL editor is missingSelect the listed data sets in Manage data sets and complete a sync.
Rubric scores exist but outcome results are missingCheck alignment and published feedback, then inspect completed rubric assessments and ambiguity exclusions.

Next guides

Failing students across Brightspace courses: final grades below a pass markHow to join Brightspace Data Sets: keys and a worked query