? Project Overview
This project delivers a comprehensive 3-page business intelligence solution designed to transform raw transactional data into actionable executive insights. By building a robust semantic layer using DAX (Data Analysis Expressions), this dashboard tracks performance across three critical business dimensions: Sales, Customers, and Products.
? The "Data Source" Connection
This project is part of a modular data architecture. It consumes data from a structured SQL Data Warehouse (Gold Layer).
Source: SQL Server (Import Mode)
Pre-processing: While basic cleaning was done in SQL, the advanced business logic and interactivity were engineered directly in Power BI using DAX.
SQL Backend Repository: (https://github.com/baheyt...)
?️ Data Modeling (Star Schema)
The foundation of this analysis is a highly optimized Star Schema, ensuring scalability and calculation accuracy.
Fact Table: fact_sales (Sales transactions and quantities).
Dimension Tables: * dim_customers: Demographic and segmentation data.
dim_products: Product catalog and performance tiering.
dim_date: A custom-built time dimension.
? Custom Date Dimension (DAX)
To support advanced Time Intelligence, I generated a dedicated date table:
dim_date = CALENDAR(MIN('gold_fact_sales'[order_date]), MAX('gold_fact_sales'[order_date]))
Quarter = YEAR(dim_date[Date]) & " Q" & QUARTER(dim_date[Date])
? Advanced DAX Engineering
To handle complex business logic directly within the data model, I engineered a series of calculated columns and measures:
1. Sales & Financial Logic
COGS (Cost of Goods Sold):
COGS = RELATED('gold_dim_products'[product_cost]) * 'gold_fact_sales'[quantity]
Total Profit:
total_profit = SUM('gold_fact_sales'[sales_amount]) - SUM('gold_fact_sales'[COGS])
Net Profit Margin:
net_profit = [total_profit] / SUM('gold_fact_sales'[sales_amount])
12-Month Moving Average =
AVERAGEX(
DATESINPERIOD(dim_date[Date], LASTDATE(dim_date[Date]), -12, MONTH),
SUM('gold fact_sales'[sales_amount])
)
Customer Intelligence & Segmentation Dynamic Age Binning: (Calculated relative to the last order date in the dataset)
age_bins =
VAR age = DATEDIFF('gold dim_customers'[birth_date], MAX('gold fact_sales'[order_date]), YEAR)
RETURN
SWITCH(TRUE,
age < 30 , "18-29",
age < 40 , "30-39",
age < 50 , "40-49",
age < 60 , "50-59",
age >= 60 , "60 & Above"
)
Customer Lifespan: lifespan = DATEDIFF(MIN_ORDER_DATE, MAX_ORDER_DATE, MONTH)
Product Performance Tiering Product Segment: Automatically tiers the catalog into High, Mid, and Low performers based on revenue.
product_segment =
VAR total_sales = CALCULATE(SUM('gold fact_sales'[sales_amount]), ALLEXCEPT('gold dim_products','gold dim_products'[product_key]))
RETURN
SWITCH(TRUE(),
total_sales > 50000, "Top-performer",
total_sales > 10000, "Mid-Level",
"Low Performer")
? Key Analytical Insights
? Executive Sales Overview Revenue Health: Generated $29M in total revenue with a steady 40% Net Profit Margin. Global Footprint: The United States market leads as the primary revenue engine, followed by Australia.
? Customer Demographics Target Audience: Customers aged 30-49 are the most significant contributors, representing approximately 68% of total revenue. Retention Patterns: Engagement analysis shows a peak retention window within the first 24 months of a customer’s lifecycle.
? Product Performance Revenue Mix: The Road Bikes subcategory is the dominant revenue driver ($14.51M), accounting for over 51% of total sales. Cost vs. Profit: High-cost bike models drive the highest absolute profit, while accessories serve as volume-based foot-traffic drivers.
?️ Tools & Technologies
Power BI Desktop: UI/UX Design, Data Visualization, and Modeling.
DAX: Advanced analytical measures and calculated columns.
SQL Server: Source data hosting (Gold Layer).
GitHub: Version control and project documentation.