Suleiman Aliyu

Senior AnalystNiger, Nigeria

Data analyst working business problems in SQL and Excel: revenue reconciliation, inventory risk, and customer growth

Looking for: data analyst, operations analyst, product analyst, financial analyst

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

Graded projects
32
Average best score
91/100
Career level
Senior Analyst
Core tool stack
SQL (18) · Excel (14)

About

Working through retail, banking, and operations scenarios on a graded simulation platform, I have built SQL queries and Excel models to answer concrete business questions across inventory, revenue, and branch data. My work spans conditional aggregation in PostgreSQL, multi-criteria SUMIFS formulas, and PivotTable-based charting.

The projects below reflect a consistent focus on producing outputs that a stakeholder can act on directly: ranked summaries, reconciled revenue figures, and clearly formatted deliverables. Each submission was independently graded, and the results documented here reflect my best-scored attempts.

Skills

SQL

  • PostgreSQL aggregate filtering with FILTER (WHERE ...)
  • Half-open interval date filtering in SQL
  • Multi-table JOIN chains in SQL
  • GROUP BY with ORDER BY for ranked summaries
  • TO_CHAR for formatted SQL output
  • Conditional COUNT with FILTER in PostgreSQL

Excel

  • SUMIFS with multiple exclusion criteria in Excel
  • Expanding-range cumulative SUM formula in Excel
  • PivotTable construction with deduplication filter
  • Combination chart building in Excel

SQL Arithmetic

  • Cents-to-currency conversion in SQL arithmetic
  • ROUND and AVG for board-ready numeric output

Retail · SQL

Negative stock identification and backorder exposure ranking by store

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

Problem

Chidi Okafor at Meridian Retail (simulated retailer) was receiving complaints from store managers about empty shelves. Inventory records were showing negative stock quantities, meaning items were being sold beyond available supply. The task was to identify all affected products with store details and rank stores by total financial exposure.

What I did

Joining `inventory` to `stores` and `products` gives the right grain: one row per product-store combination in negative stock. A `WHERE i.stock_qty < 0` filter isolates the problem records. The exposure formula `ABS(i.stock_qty) * (p.list_price_cents / 100.0)` converts the unit shortfall into a naira value using floating-point division, with `.0` preventing integer truncation. Aggregating at store level with `COUNT(DISTINCT p.product_id)`, total units oversold, and summed exposure, then ordering by exposure descending, gives Chidi a prioritised action list rather than a flat record dump.

Finding

Sixty-six negative-stock records across 17 stores were identified, with Meridian Kano carrying the highest backorder exposure at NGN 3.83M.

Outcome

Chidi received a ranked store table showing exactly where to direct replenishment effort first, with the financial scale of each location's shortfall visible at a glance.

SELECT 
 s.store_id,
 s.name,
 s.city,
 COUNT(DISTINCT p.product_id) AS products_in_negative_stock,
 SUM(ABS(i.stock_qty)) AS total_units_oversold,
 SUM(ABS(i.stock_qty) * (p.list_price_cents / 100.0)) AS total_backorder_exposure
FROM inventory i
JOIN stores s ON i.store_id = s.store_id
JOIN products p ON i.product_id = p.product_id
WHERE i.stock_qty < 0
GROUP BY s.store_id, s.name, s.city
ORDER BY total_backorder_exposure DESC;

The exposure calculation multiplies the absolute unit shortfall by the per-unit naira price, converting a stock count into a financial risk figure that operations management can act on directly.

Next step

Filtering further by product category would show whether the negative stock is concentrated in a particular line, which would point to a supplier or ordering process issue rather than a store-level one.

  • Multi-table JOIN chains in SQL
  • GROUP BY with ORDER BY for ranked summaries
  • Cents-to-currency conversion in SQL arithmetic
  • Conditional COUNT with FILTER in PostgreSQL

Retail · Excel

October gross vs net revenue reconciliation in Excel

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

Problem

Nura Ibrahim at Meridian Retail (simulated retailer) needed October 2023 revenue calculated in Excel to cross-check against the Finance system. The specific question was how much of gross revenue was lost to cancelled, returned, and refunded orders.

What I did

Using SUMIFS, I filtered the `total_naira` column by an October 2023 date range to produce the gross figure. The net formula chains three additional `<>` criteria to exclude the three non-revenue statuses in a single expression. The gap in the third cell is a live subtraction formula rather than a hardcoded number, so it updates if the source data changes. All three values are formatted with the NGN prefix and thousand separators to match the Finance team's reporting style.

Finding

Gross revenue for October 2023 was NGN 56,876,792.48, net revenue was NGN 38,450,382.35, and the gap attributable to cancellations, returns, and refunds was NGN 18,426,410.13.

Outcome

Nura received a live, auditable Excel model that confirmed which figure each system was reporting and quantified the difference for her board presentation.

Next step

Splitting the NGN 18,426,410.13 gap by individual status (cancelled vs returned vs refunded) would show which category drives the most revenue loss and where intervention is most valuable.

  • SUMIFS with multiple exclusion criteria in Excel
  • Multi-criteria date range filtering in Excel

Banking · SQL

Regional branch footprint summary for board geographic profile

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

Problem

Sarah Chen at Nexus Financial (simulated bank) needed a clean regional summary of all 45 branches for a board geographic profile. The ask was branch count, average square footage, and full-service branch count per region, ordered by branch count descending.

What I did

Querying `nexus_banking.branches`, I grouped by region and used `COUNT(*) FILTER (WHERE is_full_service = TRUE)` to produce the conditional count without a subquery or CASE expression. `ROUND(AVG(square_feet), 0)` keeps square footage as whole numbers, appropriate for a board-level table. Ordering by `branch_count DESC` surfaces the West region at the top and makes the regional ranking immediately readable.

Finding

All 45 branches account across the five regions, with West leading at 15 branches and three regions tied at 7 each.

Outcome

The query gave Sarah a single, correctly ordered table ready to drop into the board geographic profile without further formatting.

SELECT 
region,
COUNT(*) as branch_count,
ROUND(AVG(square_feet), 0) AS avg_sqft,
COUNT(*) FILTER (where is_full_service = TRUE) AS full_service_count
FROM nexus_banking.branches
GROUP BY region
ORDER BY branch_count DESC;

The FILTER clause handles the conditional count in a single pass over the table, avoiding the need for a subquery or CASE WHEN pivot.

Next step

A useful next step would be breaking down full-service share within each region to see whether any region is under-served relative to its branch count.

  • PostgreSQL aggregate filtering with FILTER (WHERE ...)
  • GROUP BY with ORDER BY for ranked summaries
  • ROUND and AVG for board-ready numeric output
  • Conditional COUNT with FILTER in PostgreSQL

Retail · Excel

Monthly customer acquisition trend chart for investor presentation

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

Problem

Chidi Okafor at Meridian Retail (simulated retailer) needed a customer growth visual as the centrepiece of an investor presentation slide. The chart had to show monthly new customer counts alongside a running cumulative total, using Meridian brand colours.

What I did

A PivotTable on a new `Customer Growth` sheet sources from the full Customers range and filters `is_duplicate` to FALSE, so only unique customer acquisitions are counted. Monthly grouping spans 2021 through 2024, giving 48 data points. Column C uses the expanding-range pattern `=SUM($B$5:B5)` dragged down to accumulate the running total at each month. The combination chart pairs bars for monthly new customers with a line for the cumulative total, styled with orange bars and a navy line to match Meridian branding.

Finding

The cumulative non-duplicate customer count across the full period reached 2,131, giving Chidi a verifiable total to anchor the investor slide.

Outcome

The deliverable was a self-contained chart and PivotTable ready to embed in the investor presentation, with brand colours already applied.

Next step

Breaking acquisition down by channel alongside the monthly trend would let Chidi show investors which acquisition source is driving growth, not just that growth is occurring.

  • PivotTable construction with deduplication filter
  • Expanding-range cumulative SUM formula in Excel
  • Combination chart building in Excel

Retail · SQL

October 2023 order revenue reconciliation by status

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

Problem

Nura Ibrahim at Meridian Retail (simulated retailer) faced a discrepancy between the sales dashboard showing NGN 56.9M and the Finance system showing NGN 38.5M for October 2023. The task was to pull October orders broken down by status with both gross and net revenue so the two figures could be reconciled before a board presentation.

What I did

Filtering with a half-open interval (`created_at >= '2023-10-01' AND created_at < '2023-11-01'`) avoids any end-of-day boundary ambiguity. Within the SELECT, `SUM(total_cents) FILTER (WHERE status NOT IN ('cancelled', 'returned', 'refunded'))` isolates net revenue in the same pass that calculates gross, and a direct subtraction produces the `revenue_gap_naira` column. `TO_CHAR` with the `FM` mask and the `NGN ` prefix formats every currency figure for a non-technical reader without requiring post-processing in a spreadsheet.

Finding

Gross revenue across all 610 October orders was NGN 56,876,792.48 and net revenue was NGN 38,450,382.35, confirming that each system was correct and reporting a different population of orders.

Outcome

Nura could present a single query result to the board that showed both figures, their source logic, and the NGN 18,426,410.13 gap in one readable table.

SELECT 
status,
COUNT(*) AS total_orders,
'NGN ' || TO_CHAR(SUM(total_cents) / 100.0, 'FM99,999,999.00') AS gross_revenue_naira,
'NGN ' || TO_CHAR(COALESCE(SUM(total_cents) FILTER (WHERE status NOT IN ('cancelled', 'returned', 'refunded')), 0) / 100.0, 'FM99,999,999.00') AS net_revenue_naira,
'NGN ' || TO_CHAR((SUM(total_cents) - COALESCE(SUM(total_cents) FILTER (WHERE status NOT IN ('cancelled', 'returned', 'refunded')), 0)) / 100.0, 'FM99,999,999.00') AS revenue_gap_naira
FROM retail.orders
WHERE created_at >= '2023-10-01' AND created_at < '2023-11-01'
GROUP BY status
ORDER BY sum(total_cents) DESC;

The FILTER clause inside the aggregate computes net revenue inline, so both gross and net figures come from a single table scan grouped by status.

Next step

Running the same status breakdown across all months of 2023 would show whether October's cancellation and return volumes are typical or anomalous.

  • Half-open interval date filtering in SQL
  • PostgreSQL aggregate filtering with FILTER (WHERE ...)
  • TO_CHAR for formatted SQL output
  • Cents-to-currency conversion in SQL arithmetic
  • GROUP BY with ORDER BY for ranked summaries

Additional projects

Customer Analytics

  • Acquisition channel performance summary · Excel · 88/100
  • Monthly new customer acquisition trend · SQL · 92/100
  • Customer acquisition channel breakdown · SQL · 100/100
  • Active customer breakdown by industry · SQL · 98/100

Dashboard Development

  • Product margin summary dashboard · Excel · 88/100

Data Analysis

  • Data file structure exploration and orientation · Excel · 62/100
  • Orders table baseline summary · SQL · 100/100
  • Customer and account baseline counts · SQL · 100/100
  • Order status distribution audit · SQL · 97/100

Data Quality

  • Definitive customer count reconciliation · SQL · 95/100
  • Inventory and product data merge with Power Query · Excel · 91/100
  • Duplicate customer name pattern validation · Excel · 97/100
  • Customer count validation and deduplication audit · Excel · 92/100

Financial Reporting

  • Top products by margin erosion · SQL · 95/100
  • Dynamic category margin erosion ranking · Excel · 62/100
  • Executive KPI summary for board reporting · SQL · 95/100
  • Margin comparison by channel and category · SQL · 88/100
  • True margin calculator with XLOOKUP · Excel · 72/100
  • Discount campaign margin impact analysis · SQL · 92/100
  • Revenue gap analysis by order status · SQL · 95/100
  • Quarterly revenue by order status breakdown · Excel · 95/100

Operations Analytics

  • Inventory stock level audit with conditional formatting · Excel · 92/100
  • Inventory reorder priority calculator · Excel · 88/100
  • Reusable regional stock summary with LAMBDA · Excel · 92/100
  • Negative stock products ranked by sales velocity · SQL · 72/100
  • Regional stock health and redistribution report · SQL · 97/100
  • Product return rate analysis by category · SQL · 95/100