diff --git a/aleksis/apps/alsijil/model_extensions.py b/aleksis/apps/alsijil/model_extensions.py
index 2c5420200e3dd9a6c60ad562e495d198be4a8b39..25b036d58849e9902ff65d29c9aa5fbcfcc0d7ec 100644
--- a/aleksis/apps/alsijil/model_extensions.py
+++ b/aleksis/apps/alsijil/model_extensions.py
@@ -420,21 +420,34 @@ def generate_person_list_with_class_register_statistics(
     persons = persons.select_related("primary_group", "primary_group__school_term").order_by(
         "last_name", "first_name"
     )
+    available_personal_notes = (
+        PersonalNote.objects.filter(
+            Q(event__in=events)
+            | Q(lesson_period__in=lesson_periods)
+            | Q(extra_lesson__in=extra_lessons)
+        )
+        .order_by("person__id")
+        .distinct()
+    )
+    if get_site_preferences()["alsijil__merge_personal_notes_of_parallel_lessons"]:
+        available_personal_notes = available_personal_notes.distinct(
+            "year",
+            "week",
+            "lesson_period__period__weekday",
+            "lesson_period__period__period",
+            "person__last_name",
+            "person__first_name",
+            "person__id",
+        )
     persons = persons.annotate(
         filtered_personal_notes=FilteredRelation(
-            "personal_notes",
-            condition=(
-                Q(personal_notes__event__in=events)
-                | Q(personal_notes__lesson_period__in=lesson_periods)
-                | Q(personal_notes__extra_lesson__in=extra_lessons)
-            ),
+            "personal_notes", condition=Q(personal_notes__in=available_personal_notes)
         )
     ).annotate(
         absences_count=Count(
             "filtered_personal_notes",
             filter=Q(filtered_personal_notes__absent=True)
             & ~Q(filtered_personal_notes__excuse_type__count_as_absent=False),
-            distinct=True,
         ),
         excused=Count(
             "filtered_personal_notes",
@@ -443,7 +456,6 @@ def generate_person_list_with_class_register_statistics(
                 filtered_personal_notes__excused=True,
             )
             & ~Q(filtered_personal_notes__excuse_type__count_as_absent=False),
-            distinct=True,
         ),
         excused_without_excuse_type=Count(
             "filtered_personal_notes",
@@ -452,16 +464,16 @@ def generate_person_list_with_class_register_statistics(
                 filtered_personal_notes__excused=True,
                 filtered_personal_notes__excuse_type__isnull=True,
             ),
-            distinct=True,
         ),
         unexcused=Count(
             "filtered_personal_notes",
             filter=Q(filtered_personal_notes__absent=True, filtered_personal_notes__excused=False),
-            distinct=True,
         ),
         tardiness=Sum("filtered_personal_notes__tardiness"),
         tardiness_count=Count(
-            "filtered_personal_notes", filter=Q(filtered_personal_notes__tardiness__gt=0), distinct=True
+            "filtered_personal_notes",
+            filter=Q(filtered_personal_notes__tardiness__gt=0),
+            distinct=True,
         ),
     )
 
diff --git a/aleksis/apps/alsijil/preferences.py b/aleksis/apps/alsijil/preferences.py
index 2fd34fa7fc4f802a52ead1d2d0291789be4fb9ce..90c1a79ad8f3835f584e0eda055b3c9a054cb6d9 100644
--- a/aleksis/apps/alsijil/preferences.py
+++ b/aleksis/apps/alsijil/preferences.py
@@ -120,6 +120,14 @@ class GroupOwnersCanAssignRolesToParents(BooleanPreference):
     )
 
 
+@site_preferences_registry.register
+class MergePersonalNotesOfParallelLessons(BooleanPreference):
+    section = alsijil
+    name = "merge_personal_notes_of_parallel_lessons"
+    default = False
+    verbose_name = _("Merge the personal notes of parallel lessons")
+
+
 @person_preferences_registry.register
 class ShowGroupRolesInWeekView(BooleanPreference):
     section = alsijil