PETER DAWODU

Analyst

Data analyst building SQL, Power BI, and Excel solutions for retail, logistics, and operations problems

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

Graded projects
23
Average best score
92/100
Career level
Analyst
Core tool stack
SQL (11) · Power BI (8) · Excel (3) · email (1)

About

Working through retail and logistics scenarios on a graded simulation platform, I have built SQL queries to profile order data, applied custom Power BI brand themes, and produced live Excel summaries for customer experience stakeholders. Each task came with a specific business question and an independent reviewer who graded the result against a model answer.

Across 23 graded submissions, my work has covered customer deduplication, complaint category analysis, hub performance ranking, and stakeholder-ready communication. I focused on writing queries and formulas that stay live and update automatically, so the outputs remain usable beyond the initial request rather than becoming static snapshots.

Skills

SQL

  • SQL GROUP BY and COUNT aggregation
  • Schema-qualified table references in SQL
  • ORDER BY for ranked SQL result sets

Excel

  • Excel COUNTA and COUNTIF with dynamic ranges
  • Excel INDEX/MATCH with MAX for auto-updating labels
  • IFERROR wrapping for defensive formula design
  • Complaints-per-1000 rate calculation with volume normalisation
  • Live cross-sheet formula referencing in Excel

Power BI and Power Query

  • Power BI custom JSON theme configuration
  • Power Query M code: filtering, conditional columns, and concatenation
  • Power Query duplicate filtering with boolean flags

Retail · Power BI

Applying a custom brand theme to a live Power BI report for Meridian Retail

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

Problem

Meridian Retail (simulated retailer) needed its brand colours applied consistently before any reports were shared externally. Chidi Okafor asked me to configure a custom Power BI theme using six specific hex codes, including a sentiment mapping for good, neutral, and bad states, and save it under the name 'Meridian Retail'.

What I did

The theme was built as a JSON configuration with the six brand colours placed in the correct order inside the dataColors array, matching the brief's sequence exactly. Sentiment colours for good, neutral, and bad were defined separately so they would apply correctly to charts tracking performance states. Alongside the theme work, Power Query transformations on the retail customers table were also in place: a boolean filter on is_duplicate, a Full Name concatenation, a conditional column for Customer Tier, and an Acquisition Year extraction. Applying the theme to a report containing both a tableEx and a clusteredColumnChart confirmed the colour changes were active across real visuals.

Finding

The PBIP file confirmed all six brand colours were correctly positioned and the sentiment mapping was present, meaning the theme was fully functional across the live report.

Outcome

Meridian now has a reusable branded theme file that can be applied to any future report, ensuring visual consistency without manual colour adjustment each time.

#"Filtered Rows" = Table.SelectRows(retail_customers, each ([is_duplicate] = false)),
#"Added Custom" = Table.AddColumn(#"Filtered Rows", "Full Name", each [first_name] & " " & [last_name])

This Power Query step removes flagged duplicate customer records before any downstream columns are built, so that the Full Name concatenation and Customer Tier logic only run on clean, unique rows.

Next step

A useful next step would be to check whether the Customer Tier conditional column boundaries produce balanced segments, or whether one tier dominates in a way that limits its usefulness for filtering.

  • Power BI custom JSON theme configuration
  • Power Query M code: filtering, conditional columns, and concatenation
  • Power Query duplicate filtering with boolean flags

Retail · SQL

Profiling order statuses to support a revenue discrepancy investigation at Meridian Retail

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

Problem

Meridian Retail (simulated retailer) CFO Nura Ibrahim flagged a revenue discrepancy and needed a clear picture of what order statuses existed in the orders table before deeper analysis could begin. The specific question was how many distinct statuses the table contained and how many orders fell under each one.

What I did

A single aggregation query against retail.orders grouped rows by status and counted them, with the result sorted descending so the most common status appeared first. Using the explicit schema prefix retail.orders made the query unambiguous regardless of the session's default search path. Sorting by order_count descending rather than alphabetically meant the output was immediately readable for triage rather than requiring a second pass.

Finding

The table contained 7 distinct statuses: delivered, shipped, cancelled, confirmed, returned, pending, and refunded, with delivered accounting for 14,061 orders, the highest count of any status.

Outcome

The status profile gave the CFO a complete picture of order states to work from, establishing a reliable baseline before any revenue-focused filtering was applied.

SELECT status, COUNT(*) AS order_count
FROM retail.orders
GROUP BY status
ORDER BY order_count DESC;

This query counts rows per status and sorts them from most to least common, producing a result that is ready to read without any further transformation.

Next step

The logical next step would be to filter to financially material statuses, specifically cancelled, returned, and refunded, and join to order values to quantify the revenue impact Nura flagged.

  • SQL GROUP BY and COUNT aggregation
  • Schema-qualified table references in SQL
  • ORDER BY for ranked SQL result sets

Logistics · Excel

Building a live complaint breakdown summary for FlowRoute Logistics customer experience reporting

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

Problem

FlowRoute Logistics (simulated logistics company) Head of Customer Experience Funmi Alade needed a complaint summary her team could keep updated without manual intervention. The brief asked for a total complaints figure, a category breakdown with counts and percentages sorted from most to least common, and a single cell identifying the lead category for a board presentation.

What I did

The total was driven by COUNTA referencing the full column range on the Complaints sheet, so any new rows added later would be picked up automatically. COUNTIF formulas in the category breakdown rows reference the same source range, keeping all counts live. Percentages divide each category count by the total using an absolute reference to the total cell, with an IFERROR wrapper added in case the denominator is ever empty. The board lead cell uses INDEX/MATCH against MAX of the count range rather than a hardcoded label, so it updates automatically if category volumes change.

Finding

The dataset contained 64,737 complaints across four categories, with lost shipments the most common at 16,551, followed closely by wrong address, late delivery, and damaged goods.

Outcome

Funmi's team received a summary sheet with fully live formulas, meaning the headline figures and the board lead cell will update as new complaint records are added without any manual rework.

Next step

Splitting the category breakdown by hub would show whether certain hubs drive a disproportionate share of a specific complaint type, which the current summary does not reveal.

  • Excel COUNTA and COUNTIF with dynamic ranges
  • Excel INDEX/MATCH with MAX for auto-updating labels
  • IFERROR wrapping for defensive formula design
  • Live cross-sheet formula referencing in Excel

Retail · Email

Communicating the verified clean customer count to a Meridian Retail stakeholder ahead of an investor meeting

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

Problem

Meridian Retail (simulated retailer) stakeholder Chidi Okafor was walking into an investor meeting and needed the clean customer count in a format readable on a phone. The message had to include the figure, a one-sentence explanation of why it was the right number to use, and a caveat about duplicate records so no one in the meeting would be surprised by a different figure from another team.

What I did

The count of 2,131 came from filtering the customers table to records where is_duplicate equals false, excluding the 200 duplicate-flagged rows present in the full table. The explanation was kept to a single sentence to match the phone-reading constraint Chidi specified. Flagging the 200 duplicate records in a separate sentence gave Chidi a ready answer if another team quoted the higher unfiltered total.

Finding

The clean, deduplicated customer count is 2,131, with 200 records excluded as flagged duplicates.

Outcome

Chidi had a defensible, clearly sourced number to use in the investor meeting, along with a pre-emptive explanation for any count discrepancy raised by other teams.

Next step

It would be useful to examine the 200 duplicate records more closely to understand whether they are true duplicates across channels or data entry errors, since the answer affects how acquisition numbers should be interpreted.

  • Power Query duplicate filtering with boolean flags
  • Concise stakeholder communication of data findings

Logistics · Excel

Ranking FlowRoute Logistics hubs by complaint rate to identify operational risk

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

Problem

FlowRoute Logistics (simulated logistics company) Head of Customer Experience Funmi Alade needed to know which hubs posed the most operational risk, without letting raw shipment volume distort the picture. The brief asked for a hub table combining delivery rates and complaint counts, a volume-normalised complaints-per-1,000-shipments metric, and an honest verdict on whether any hub truly stood out.

What I did

Hub fields were pulled with direct cell references to Hub_Performance rather than pasted values, so the table stays live if the source sheet changes. Complaint counts per hub use COUNTIF against the full Complaints sheet column, matching each hub name dynamically. The complaints-per-1,000 formula divides each hub's complaint count by its own total_shipments and multiplies by 1,000, with IFERROR protecting against division by zero. Delivery rates were divided by 100 and formatted as percentages to match the source values correctly.

Finding

Ibadan led on complaints per 1,000 shipments at approximately 36.50, but the spread across all eight hubs was only around 0.78, meaning no single hub was a clear outlier warranting targeted intervention.

Outcome

Funmi received an honest, evidence-based verdict: the data did not support singling out one hub, which prevented a misplaced operational focus and gave a more accurate picture of system-wide complaint distribution.

=COUNTIF(Complaints!$E$2:$E$1048576,A4)
=IFERROR(E4/C4*1000,0)
=Hub_Performance!G3/100

These three formulas count complaints per hub from the source sheet, convert the raw count to a per-1,000-shipments rate using each hub's own volume as the denominator, and pull the delivery rate as a true decimal for percentage formatting.

Next step

Breaking complaints per 1,000 shipments down by complaint category per hub would show whether Ibadan's marginal lead is concentrated in one failure type or spread evenly, which would determine whether the response is operational or process-related.

  • Excel COUNTA and COUNTIF with dynamic ranges
  • Complaints-per-1000 rate calculation with volume normalisation
  • IFERROR wrapping for defensive formula design
  • Live cross-sheet formula referencing in Excel

Additional projects

Customer Analytics

  • Monthly new customer acquisition over 24 months · SQL · 92/100
  • Customer acquisition breakdown by channel · SQL · 100/100
  • Definitive customer count for investor reporting · SQL · 90/100

Dashboard Development

  • October revenue by order status bar chart · Power BI · 88/100
  • Customer overview dashboard for investor presentation · Power BI · 52/100
  • Complaints overview dashboard for customer experience leadership · Power BI · 95/100

Data Analysis

  • Meridian sales data profiling in Excel · Excel · 55/100
  • October 2023 order count verification · SQL · 100/100

Data Modeling

  • Power BI connection to Meridian database · Power BI · 100/100

Data Quality

  • Orders table currency conversion in Power Query · Power BI · 95/100
  • Order items price normalization in Power Query · Power BI · 95/100
  • Customer dimension deduplication in Power Query · Power BI · 95/100
  • Deduplicated customer count for accurate reporting · SQL · 100/100

Financial Reporting

  • Revenue gap analysis by order status · SQL · 95/100
  • Orders table baseline summary for revenue investigation · SQL · 100/100
  • October 2023 revenue reconciliation by month · SQL · 95/100

Operations Analytics

  • Complaint volume baseline for board reporting · SQL · 92/100
  • Hub level complaint performance ranking · SQL · 88/100