This assignment asks students to build a three-page Power BI report using the Motion Forward Physical Therapy dataset (patient_insurers table). Students must demonstrate proficiency in: creating and formatting core visuals (card, donut chart, bar chart, line chart, table, slicers), writing DAX measures of varying complexity (DISTINCTCOUNT, COUNTROWS, DATEDIFF), configuring drill-through navigation, applying conditional formatting, using the Analytics pane for reference lines, and validating data model relationships. Page 1 (easy, 28 pts) establishes foundational skills; Page 2 (medium, 42 pts) introduces time intelligence and multi-field chart construction; Page 3 (hard, 22 pts) requires drill-through configuration and advanced table formatting. Four DAX measures (18 pts total) are graded separately. Total assignment = 92 points. Instructors should verify correct field placement in wells, accurate DAX syntax, cross-visual slicer interactions, and visual formatting compliance as outlined below.
General partial credit guidance for this Power BI assignment: Data correctness outweighs formatting — if a visual shows the right data from the right fields but lacks specified formatting (colors, font sizes, borders), award 60-70% of visual points. If the correct measure is referenced but is itself incorrect, award formatting points for the visual but reduce measure points separately. For DAX measures, award partial credit on a sliding scale based on conceptual correctness: correct function family but wrong column = 50%, correct formula but missing null handling = 75%, correct formula with minor syntax variation that still evaluates correctly = 100%. For drill-through configuration, do not award partial credit on the drill-through well placement specifically — either the drill-through works when tested or it does not; however, award points for the table structure and formatting independently of whether drill-through functions. For slicers, award at least half points if the correct field is placed in the slicer even if the style (Tile, Dropdown, Search) was not changed, since the data interaction is correct. Never award zero on a visual unless the student did not attempt it at all or the field wells are entirely wrong.
VISUAL 1 — Total Unique Patients Card: (1) Create the DAX measure first (see DAX section). (2) In the Visualizations pane select the Card icon. (3) From the Fields pane expand patient_insurers and drag [Total Unique Patients] into the 'Fields' well. (4) In Format visual > General > Title: toggle On, type 'Total Unique Patients', set font size to 14, bold. (5) In Format visual > Callout value: set font size to 20, bold. (6) In Format visual > General > Effects > Background: toggle On, pick a light blue color (e.g., hex #D6EAF8). (7) General > Border: toggle Off. (8) Resize to roughly 2x1.5 inches and position upper-left of canvas. VISUAL 2 — Policy Distribution by Insurer Donut Chart: (1) In Visualizations pane click the Donut chart icon. (2) Drag patient_insurers[insurer_id] into the 'Legend' well. Right-click insurer_id in the well and choose 'Don't summarize' if Power BI tries to aggregate it. (3) Drag patient_insurers[patient_insurer_id] into the 'Values' well; confirm it reads 'Count of patient_insurer_id'. (4) Format visual > Detail labels: toggle On, set label contents to 'Category, percent of total'. (5) Format visual > Slices > Inner radius: drag slider to 50. (6) General > Title: toggle On, type 'Policy Distribution by Insurer', font size 14. (7) Resize and position centrally. VISUAL 3 — Primary Coverage Filter Slicer: (1) In Visualizations pane click Slicer icon. (2) Drag patient_insurers[is_primary] into the 'Field' well. (3) Click the dropdown arrow (chevron) in the upper-right corner of the slicer visual and select 'Tile'. (4) Format visual > General > Title: toggle On, type 'Primary Coverage?', bold. (5) Format visual > Tiles > Selected state: set background to a contrasting color such as dark teal (#1A7A6E). (6) Format visual > Slicer settings > Selection: toggle 'Single select' Off so users can independently select True or False. (7) Go to View tab > Edit Interactions; confirm the slicer shows filter icons over both other visuals. (8) Position slicer top-right or in a side panel.
Visual 1 (8 pts): Award 3 pts for correct [Total Unique Patients] measure in field well; 2 pts for title font size 14 and bold; 2 pts for light blue background; 1 pt for correct positioning. Visual 2 (10 pts): Award 3 pts for insurer_id in Legend and count of patient_insurer_id in Values; 3 pts for data labels showing category and percent; 2 pts for inner radius at or near 50%; 2 pts for title. Visual 3 (10 pts): Award 3 pts for is_primary in field well and Tile style applied; 3 pts for contrasting highlight color on selected tile; 2 pts for clear title 'Primary Coverage?'; 2 pts for confirmed cross-filter interaction with other visuals. Award partial credit when the correct field is in the right well but formatting is incomplete.
Looking at the donut chart showing policy distribution by insurer — what business question might a clinic administrator ask that this chart alone cannot answer, and what additional data or visual would you add to the page to answer it?
SETUP — Calculated Column (if needed): If coverage_start does not auto-expand to a date hierarchy, in the Data view select patient_insurers table and create: Coverage Year = YEAR(patient_insurers[coverage_start]). Ensure coverage_start column data type is Date in Power Query (Home > Transform data; select column > Data Type > Date). VISUAL 1 — Coverage Start Year Slicer: (1) Insert Slicer. (2) Expand coverage_start hierarchy in Fields pane and drag 'Year' into Field well (or drag Coverage Year calculated column). (3) Click visual header dropdown arrow and select 'Dropdown'. (4) Format visual > Slicer header: toggle On, bold, font size 12. (5) View > Edit Interactions: confirm this slicer filters both the line chart and bar chart. VISUAL 2 — New Policies Enrolled Line Chart: (1) Insert Line chart. (2) Expand coverage_start hierarchy; drag 'Month' into X-axis well. If hierarchy is unavailable, create a calculated column Coverage Month = FORMAT(patient_insurers[coverage_start],'YYYY-MM') and use it. (3) Drag [New Policies Enrolled] into Y-axis. (4) Format visual > Lines: solid line; Markers: toggle On, size 4; Line > Line ends: Round. (5) Data labels: toggle On; configure to show only last data point (Apply settings to: Last data point). (6) Click Analytics pane icon (magnifying glass below Visualizations icons). Expand 'Average line' and click Add. Set label to 'Avg Enrollment', style to dashed, color to a contrasting gray. (7) General > Title: 'New Policies Enrolled Over Time'. (8) Set X-axis and Y-axis titles. VISUAL 3 — Total Policies by Insurer and Primary Status Clustered Bar Chart: (1) Go to Model view. Verify that if an insurers table exists, patient_insurers[insurer_id] has a many-to-one relationship to it. If missing and table exists, drag the key fields to connect them. Return to Report view. (2) Insert Clustered bar chart. (3) Drag patient_insurers[insurer_id] into Y-axis. Right-click in well and choose 'Don't summarize'. (4) Drag [Total Policies] into X-axis. (5) Drag patient_insurers[is_primary] into Legend. (6) Format visual > Bars: set distinct fill colors per legend value (e.g., teal for primary, orange for non-primary) under 'Colors'. (7) Data labels: toggle On, position 'Outside end'. (8) Click ellipsis (...) on visual > Sort axis > Total Policies > Sort descending. (9) General > Title: 'Total Policies by Insurer and Primary Status'.
Visual 1 (8 pts): 3 pts for correct Year field in slicer and Dropdown style; 2 pts for bold header; 3 pts for confirmed interaction with line and bar chart. Visual 2 (14 pts): 3 pts for Month-level date on X-axis; 3 pts for [New Policies Enrolled] measure on Y-axis; 3 pts for average reference line labeled 'Avg Enrollment'; 3 pts for markers, rounded line ends, and last-point data label; 2 pts for title and axis labels. Visual 3 (20 pts): 3 pts for correct field wells (insurer_id Y-axis, [Total Policies] X-axis, is_primary Legend); 4 pts for relationship verification noted or demonstrated; 4 pts for distinct colors per primary status; 4 pts for data labels and sort descending; 3 pts for title and formatting; 2 pts for axis titles. Award partial credit when the correct fields are in correct wells but sort or color formatting is missing.
The line chart shows monthly policy enrollments over time. If you noticed a sharp spike in enrollments during a particular month, what are two business explanations that could account for that spike, and how might you use Power BI to investigate whether your hypothesis is correct?
SETUP — Page Configuration: Right-click the page tab and rename to 'Drill-Through Patient Policy Detail'. In the Visualizations pane (with nothing selected), scroll to find the 'Drill through' section at the bottom. Drag patient_insurers[insurer_id] into the 'Add drill-through fields here' well. Power BI will auto-generate a Back button on the canvas; if it does not, go to Insert tab > Buttons > Navigator > Back. VISUAL 1 — Search by Policy Number Slicer: (1) Insert Slicer. (2) Drag patient_insurers[policy_number] into Field well. Confirm in Model view that policy_number is data type Text. (3) Click the visual header dropdown arrow and select 'Search'. (4) Format visual > General > Border: toggle On, set corner radius to 5. (5) General > Title: toggle On, type 'Search by Policy Number'. (6) View > Edit Interactions: confirm slicer filters the table visual below it. (7) Position above the detail table. VISUAL 2 — Patient Policy Detail Table: (1) Create the [Coverage Duration (Days)] measure first (see DAX section). (2) Insert Table visual. (3) Drag into Columns well in this order: patient_insurers[patient_id], patient_insurers[insurer_id], patient_insurers[policy_number], patient_insurers[coverage_start], patient_insurers[is_primary], [Coverage Duration (Days)]. (4) Format visual > Style presets: select 'Alternating rows'. If not available, go to Grid > Alternating row color: toggle On and pick a light gray. (5) Column headers: toggle Bold On; set header background color (e.g., dark blue with white text). (6) Adjust column widths: hover over column divider in the visual and drag to fit content. (7) Conditional formatting on Coverage Duration (Days): in the Columns field well, click the dropdown arrow next to [Coverage Duration (Days)] > Conditional formatting > Background color. In the dialog: Format style = Gradient; Minimum value = Lowest value, color = Red (#FF0000); Maximum value = Highest value, color = Green (#00B050). Click OK. (8) Back button: If not auto-generated, Insert tab > Buttons > Navigator > Back. Position upper-left. In Format > Action, confirm Type is 'Back'. (9) Test: Go to Page 2, right-click a bar segment for an insurer, hover over 'Drill through', and confirm 'Drill-Through Patient Policy Detail' appears as an option. Click it to verify navigation and that the Back button returns to Page 2.
Visual 1 (6 pts): 2 pts for policy_number in field well and Search style applied; 2 pts for rounded border formatting; 2 pts for clear title and confirmed filter interaction with table. Visual 2 (16 pts): 3 pts for all six correct columns in the Columns well in a logical order; 3 pts for drill-through correctly configured on this page with insurer_id in the drill-through well; 3 pts for conditional formatting on Coverage Duration (Days) with red-to-green gradient in correct direction; 3 pts for alternating row colors and bold column headers; 2 pts for functional Back button (Insert > Buttons > Back type, not a shape); 2 pts for confirmed drill-through test from Page 2. Award partial credit when drill-through is configured but Back button is wrong type (award 1 of 2 Back button points). Award partial credit when conditional formatting is applied but color direction is reversed (award 1 of 3 conditional formatting points).
Drill-through navigation is designed to take users from a summary view to a detail view. In the context of a physical therapy practice, who would be the likely end-user of this drill-through page, and what action might they take based on what they see in the Patient Policy Detail table?
Total Unique Patients = DISTINCTCOUNT(patient_insurers[patient_id])
Award 3/3 for correct DISTINCTCOUNT on patient_id. Award 2/3 if the student uses COUNTROWS(DISTINCT(patient_insurers[patient_id])) or VALUES() approach that produces the same correct result. Award 1/3 if the syntax is correct DAX but references the wrong column (e.g., patient_insurer_id). Award 0/3 for COUNT or SUM without distinctness.
Total Policies = COUNTROWS(patient_insurers)
Award 3/3 for COUNTROWS(patient_insurers). Award 3/3 for COUNT(patient_insurers[patient_insurer_id]) since the result is equivalent on this dataset. Award 2/3 for DISTINCTCOUNT(patient_insurers[patient_insurer_id]) — logically close but slightly different semantics. Award 0/3 if the measure errors or returns a constant that ignores filter context.
New Policies Enrolled = COUNTROWS(patient_insurers)
Award 4/4 for COUNTROWS(patient_insurers) — this is correct because the measure dynamically responds to the date filter context provided by the coverage_start Month axis on the line chart. Award 4/4 for COUNT(patient_insurers[patient_insurer_id]) for the same reason. Award 3/4 for CALCULATE(COUNTROWS(patient_insurers)) — technically works but the CALCULATE with no filter is unnecessary; accept with a note. Award 2/4 if the student writes a measure that returns correct totals when unfiltered but includes an internal FILTER that prevents it from working correctly on the line chart. Award 0/4 if the measure returns a constant regardless of filter context.
Coverage Duration (Days) = IF(ISBLANK(patient_insurers[coverage_start]), BLANK(), DATEDIFF(patient_insurers[coverage_start], TODAY(), DAY))
Award 8/8 for the correct formula with ISBLANK check, correct DATEDIFF argument order, TODAY(), and DAY interval. Award 7/8 if formula is correct but uses NOW() instead of TODAY() — results are nearly identical for day-level calculations, minor deduction. Award 6/8 if DATEDIFF is correct but ISBLANK check is missing — no blank handling. Award 5/8 if argument order in DATEDIFF is reversed (negative values output). Award 4/8 if the student uses a calculated column approach (correct logic but wrong object type) and it displays correctly in the table — note that as a measure it would show BLANK in the card context but work in the table. Award 2/8 if syntax is recognizable DAX but formula will error at evaluation. Award 0/8 if the formula is completely wrong or missing.