Anuoluwa Olasunkanmi

Junior Analyst

Junior data analyst building retail data models and Power Query pipelines in Power BI

Scores reflect independent, automated grading of simulated business tasks completed on DataSimHQ.

Graded projects
6
Average best score
99/100
Career level
Junior Analyst
Core tool stack
Power BI (6)

About

Working through a connected series of retail scenarios, I set up a multi-table PostgreSQL data model in Power BI, configured star-schema relationships, and wrote Power Query M code to clean and reshape raw transactional data before any reporting began. The work covered currency conversion from kobo to naira, duplicate customer removal, computed columns for segmentation, and brand theme configuration across a single evolving report file.

Each submission was independently graded on the correctness of the M code, the integrity of the data model, and the logical sequencing of transformation steps. The scores reflect what the grader confirmed was working, not what I intended to build.

Skills

Power BI Data Modeling

  • PostgreSQL connection via Power BI Import mode
  • Star-schema relationship configuration in Power BI
  • Inactive relationship management to avoid ambiguous filter paths

Power Query and M Code

  • Power Query M code authoring
  • Table.TransformColumns for arithmetic conversion
  • Table.RenameColumns for display naming
  • Table.TransformColumnTypes for date casting
  • Table.SelectRows for row-level filtering
  • Table.AddColumn for computed and conditional columns
  • Date.Year extraction in Power Query
  • Applied Steps sequencing in Power Query

Power BI Report Configuration

  • Custom JSON theme authoring in Power BI

Retail · Power BI

Connecting Power BI to a PostgreSQL retail database and configuring an 8-table star schema

Independent grading: 100/100(verify, opens in a new tab)

Problem

Nura Ibrahim, a stakeholder at Meridian Retail (simulated retailer), needed a visual analysis of a revenue discrepancy. Before any report could be built, the full transactional database had to be loaded into Power BI, covering orders, customers, products, categories, stores, inventory, and sessions across 8 tables.

What I did

Using Import mode, I connected Power BI Desktop to the Meridian PostgreSQL server and navigated each table through the retail schema using M code. Power BI auto-detected 9 relationships, which I reviewed against the expected star-schema structure: order_items linking to orders, orders linking to customers and stores, and products linking to categories. The sessions table presented an ambiguity, it linked to both customers and orders, so I set the sessions-to-orders relationship as inactive to avoid conflicting filter paths. The file was saved in PBIP format as instructed.

Finding

All 8 required tables loaded correctly with 9 relationships in place, matching the star-schema structure needed for revenue analysis.

Outcome

Nura had a fully connected data model ready for revenue visuals, with no broken relationships and no ambiguous filter paths that could distort aggregations.

let
 Source = PostgreSQL.Database("ep-frosty-glade-ab4k8hyw-pooler.eu-west-2.aws.neon.tech", "meridian_retail"),
 #"Navigation 1" = Source{[Schema = "retail", Item = "orders"]}[Data]
in
 #"Navigation 1"

This M code connects to the Meridian PostgreSQL database and navigates to the retail schema to load the orders table, the same pattern was applied to all 8 tables.

Next step

A useful next step would be to check whether the inactive sessions-to-orders relationship needs to be activated for session-level revenue analysis, and whether a USERELATIONSHIP measure is required to query that path.

  • PostgreSQL connection via Power BI Import mode
  • Power Query M code authoring
  • Star-schema relationship configuration in Power BI
  • Inactive relationship management to avoid ambiguous filter paths

Retail · Power BI

Converting monetary values from kobo to naira and casting date types in Power Query

Independent grading: 100/100(verify, opens in a new tab)

Problem

Nura Ibrahim at Meridian Retail needed the orders table cleaned before any revenue visuals could be built. The total_cents column stored values in kobo rather than naira, and the created_at timestamp included a time component that was not useful for date-level analysis.

What I did

Using Table.TransformColumns, I divided total_cents by 100 to convert from kobo to naira. To avoid encoding problems with the naira symbol during the division step, I first renamed the column to a safe placeholder before applying the final display name Total (NGN), a two-rename approach the grader confirmed produced an identical output to the single-step canonical method. The created_at column was cast to type date using Table.TransformColumnTypes, stripping the time component. The Applied Steps run in order: Navigation 1, Renamed Columns, Divided Column, Changed Type, Renamed Columns1.

Finding

The orders table was confirmed clean, with the currency column correctly converted to naira and created_at resolved to date type, without breaking any of the 9 model relationships.

Outcome

Nura's team could build date-level revenue visuals directly from the cleaned orders table, with no downstream unit conversion needed.

#"Divided Column" = Table.TransformColumns(
 #"Navigation 1",
 {{"total_cents", each _ / 100, type number}}
),
#"Renamed Columns" = Table.RenameColumns(
 #"Divided Column",
 {{"total_cents", "Total (NGN )"}}),
#"Changed Type" = Table.TransformColumnTypes(
 #"Renamed Columns",
 {{"created_at", type date}})

This sequence divides total_cents by 100 to convert kobo to naira, renames the result to the display name, and then casts the date column, matching the logical order required to avoid referencing stale column names.

Next step

It would be worth checking whether the two-rename workaround for the NGN character causes any issues if the report is published to a Power BI Service tenant with different locale settings.

  • Power Query M code authoring
  • Table.TransformColumns for arithmetic conversion
  • Table.RenameColumns for display naming
  • Table.TransformColumnTypes for date casting
  • Applied Steps sequencing in Power Query

Retail · Power BI

Cleaning three price columns in the order items table from kobo to naira

Independent grading: 100/100(verify, opens in a new tab)

Problem

Nura Ibrahim at Meridian Retail flagged that the order_items table stored unit prices, discounts, and line totals in kobo, matching the same issue found in the orders table. All three columns needed to be converted to naira and renamed before being used in any revenue or margin calculations.

What I did

All three columns, unit_price_cents, discount_cents, and line_total_cents, were transformed in a single Table.TransformColumns call, dividing each by 100. The rename step followed using Table.RenameColumns, producing the display names Unit Price (NGN), Discount (NGN), and Line Total (NGN). Dividing before renaming ensured no step referenced a column name that no longer existed. The same conversion pattern applied to the orders table was used consistently here, which the grader noted as a positive sign of uniform data-cleaning habits across tables.

Finding

All three price columns were correctly converted from kobo to naira, with display names matching the stakeholder's specification.

Outcome

The cleaned order_items table gave Nura's team a reliable base for revenue and margin calculations, with all monetary fields expressed in naira and named consistently.

Next step

A natural follow-on would be to verify that Line Total (NGN) equals Unit Price (NGN) multiplied by quantity minus Discount (NGN) at the row level, to confirm no rounding differences were introduced by separate kobo-to-naira conversions.

  • Power Query M code authoring
  • Table.TransformColumns for arithmetic conversion
  • Table.RenameColumns for display naming
  • Applied Steps sequencing in Power Query

Retail · Power BI

Creating and applying a branded Power BI report theme for Meridian Retail

Independent grading: 100/100(verify, opens in a new tab)

Problem

Before any reports from Meridian Retail (simulated retailer) were shared externally, the team needed a consistent brand identity applied in Power BI. The stakeholder specified six exact hex codes covering the primary, secondary, accent, and sentiment palette, and asked that the theme be saved under the name Meridian Retail.

What I did

A custom JSON theme file was authored with the name field set to Meridian Retail and the dataColors array ordered to open with the primary orange (#E8521A) and deep navy (#1A2E4A), followed by amber, teal, green, and red in the sequence the brief specified. The sentiment colours, #4A6741 for good, #F0A500 for neutral, and #CC2200 for bad, were included to ensure any conditional formatting visuals would pick up the correct palette automatically. The theme was then applied to the report, confirmed by the grader via the custom theme field in the PBIP metadata.

Finding

The theme was applied correctly, with all six brand colours present in the specified sequence and the theme name matching the requirement exactly.

Outcome

Meridian's reports now carry a consistent brand identity, and any chart series added in future will draw from the correct colour order without manual formatting.

Next step

The next useful step would be to test how the sentiment palette behaves on a KPI card or conditional formatting rule, to confirm the good/neutral/bad colours render as intended rather than falling back to the dataColors sequence.

  • Custom JSON theme authoring in Power BI
  • Star-schema relationship configuration in Power BI

Retail · Power BI

Deduplicating the customer dimension and adding segmentation columns in Power Query

Independent grading: 100/100(verify, opens in a new tab)

Problem

Chidi Okafor needed a clean customer dimension to power a customer dashboard at Meridian Retail. The raw customers table contained known duplicate records that would inflate counts, and it lacked a display name, an acquisition year, and a tier label, all of which the dashboard required.

What I did

The first step was a Table.SelectRows filter on is_duplicate = false, placed at the top of the Applied Steps so that all subsequent columns were built only over the deduplicated row set. Table.AddColumn then concatenated first_name and last_name with a space separator to produce Full Name. A second Table.AddColumn call used Date.Year on created_at and typed the result as Int64 to produce the Acquisition Year. The tier column used conditional column logic: total_orders less than or equal to 1 maps to New, less than or equal to 9 maps to Regular, and anything above maps to Loyal, matching the task definition precisely.

Finding

The filter removed 200 duplicate records, leaving 2,131 non-duplicate customers, with Full Name, Acquisition Year, and Customer Tier columns all correctly populated.

Outcome

Chidi had a deduplicated, enriched customer table with segmentation logic built in, ready for aggregation in any dashboard visual without risk of double-counting.

Next step

It would be worth checking the tier distribution across the 2,131 deduplicated customers to see whether the New/Regular/Loyal split is skewed in a way that would affect how useful the tier column is as a slicer in Chidi's dashboard.

  • Table.SelectRows for row-level filtering
  • Table.AddColumn for computed and conditional columns
  • Date.Year extraction in Power Query
  • Applied Steps sequencing in Power Query
  • Power Query M code authoring