Contoso_Grouping_Binning_Practice_Guide
Practice Guide:
Using Contoso Dataset - For Finance Data Analysts (PL-300 Certification)
📋 Core Concepts
What is Grouping?
- Definition: Categorizing data points into meaningful categories
- Use Case: Combining multiple values into a single category for analysis
- Contoso Example: Grouping high-revenue stores, product categories, or customer segments
What is Binning?
- Definition: Grouping continuous numerical or date fields into equal-sized intervals
- Use Case: Creating ranges for analysis (age groups, revenue brackets, time periods)
- Contoso Example: Sales amount ranges ($0-10K, $10K-50K, $50K-100K+)
Key Difference
- Grouping = Manual selection of specific values to combine
- Binning = Automatic division of continuous data into equal intervals
📦 Contoso Dataset Overview
Tables You’ll Use:
- Sales - Transaction data (SalesAmount, UnitPrice, SalesQuantity)
- Products - Product info (ProductName, Category, SubCategory, UnitCost)
- Stores - Store locations (StoreName, StoreType, AreaSize)
- Geography - Location data (ContinentName, RegionCountryName, StateProvinceName, CityName)
- Customers - Customer demographics (CustomerKey, Gender, YearlyIncome, TotalChildren)
- Calendar - Date dimension (Date, Year, Quarter, Month)
Key Measures to Create First:
Total Sales = SUM(Sales[SalesAmount])
Total Quantity = SUM(Sales[SalesQuantity])
Total Cost = SUMX(Sales, Sales[SalesQuantity] * RELATED(Product[UnitCost]))
Profit = [Total Sales] - [Total Cost]
Profit Margin % = DIVIDE([Profit], [Total Sales], 0) * 100💼 Contoso Financial Analysis Scenarios
Scenario 1: Store Performance Analysis
Business Question: Which stores should receive additional investment?
What You’ll Group: Stores by sales performance - High Performers: Stores with Total Sales > $5M - Medium Performers: Stores with Total Sales $2M-$5M
- Low Performers: Stores with Total Sales < $2M
Scenario 2: Customer Lifetime Value Segmentation
Business Question: How do we prioritize customer segments?
What You’ll Bin: Customers by YearlyIncome field - Create bins: $0-25K, $25K-50K, $50K-75K, $75K-100K, $100K+ - Analyze purchase behavior by income bracket
Scenario 3: Product Category Prioritization
Business Question: Which product categories drive profitability?
What You’ll Group: Product categories by profit margin - Premium Products: Margin > 40% - Standard Products: Margin 20-40% - Budget Products: Margin < 20%
🛠️ Hands-On Practice Exercises with Contoso
Exercise 1: Grouping Stores by Sales Performance
Step-by-Step Instructions:
1. Load Contoso Dataset - Open Power BI Desktop - Get Data → Sample → Contoso Sales Sample - Load all tables
2. Create Base Measure
Total Sales = SUM(Sales[SalesAmount])3. Build Initial Visual
- Insert Clustered Bar Chart
- Y-axis: Add Store[StoreName]
- X-axis: Add [Total Sales] measure
- Sort by Total Sales (descending)
4. Identify Top Performers - Look at the chart and identify stores with sales > $5,000,000 - Typical top stores: Contoso Catalog Store, major flagship locations
5. Create Manual Group - Hold Ctrl and click on 5-6 top-performing stores - Right-click one selected bar - Select “Group Data” - Notice: Visual updates, new group appears in Legend
6. Customize Group Names - Right-click the new group field in Legend well or Data pane - Select “Edit Groups” - In Groups window: - Double-click first group name - Rename to: “Flagship Stores” - Double-click “Other” group - Rename to: “Standard Stores” - Click OK
7. Verify and Use
- Check Fields pane → Look for StoreName (groups)
- Drag this grouped field to a new visual (Donut Chart)
- Add [Total Sales] to Values
- See percentage split between Flagship and Standard stores
Expected Result: - Flagship Stores: ~60-70% of total sales - Standard Stores: ~30-40% of total sales
Exercise 2: Binning Customer Income Levels
Step-by-Step Instructions:
1. Locate Income Field
- Go to Fields pane
- Expand Customer table
- Find YearlyIncome field
2. Create Bin Group
- Right-click Customer[YearlyIncome]
- Select “New Group”
- Group type: Select “Bin”
3. Configure Bin Settings - Option A (By Bin Size)
- Bin type: “Size of bins”
- Bin size: Enter 25000 (for $25K intervals)
- Min value: Leave default (or enter 0)
- Max value: Leave default
- Click OK
Alternative - Option B (By Number of Bins) - Bin type: “Number of bins”
- Number of bins: Enter 5
- Click OK
4. Find Your New Binned Field
- In Fields pane → Customer table
- Look for: YearlyIncome (bins)
5. Create Visualization
- Insert Clustered Column Chart
- X-axis: Add YearlyIncome (bins)
- Y-axis: Add measure:
Customer Count = DISTINCTCOUNT(Sales[CustomerKey])- Secondary Y-axis: Add
[Total Sales]
6. Analyze Results - Which income bracket has most customers? - Which bracket generates highest revenue? - Is high income = high sales?
Expected Insight: Middle-income brackets ($50K-75K) often have highest customer count, while $100K+ drives significant revenue per customer.
Exercise 3: Product Category Performance Groups
Step-by-Step Instructions:
1. Create Profit Margin Measure
Profit Margin % =
VAR TotalSales = SUM(Sales[SalesAmount])
VAR TotalCost = SUMX(Sales, Sales[SalesQuantity] * RELATED(Product[UnitCost]))
VAR Profit = TotalSales - TotalCost
RETURN
DIVIDE(Profit, TotalSales, 0) * 1002. Build Category Visual
- Insert Matrix visual
- Rows: Add Product[Category]
- Values: Add [Profit Margin %]
- Sort by Profit Margin % (descending)
3. Identify Margin Tiers - Observe which categories have: - High margin (>40%): Premium categories - Medium margin (20-40%): Standard categories
- Low margin (<20%): Budget categories
4. Create Groups from Visual
- Switch to Clustered Bar Chart
- Axis: Product[Category]
- Values: [Profit Margin %]
- Ctrl+Click high-margin categories (typically: Audio, Cameras, Computers)
- Right-click → “Group Data”
- Name: “Premium Categories”
5. Create Second Group - Ctrl+Click low-margin categories - Right-click → “Group Data”
- Edit Groups → Rename to “Value Categories” - Remaining items become “Standard Categories”
6. Analyze Sales Mix
- Create Stacked Bar Chart
- Axis: Category (groups)
- Values: [Total Sales]
- Legend: Product[SubCategory]
- See revenue contribution by category tier
📊 Additional Contoso Practice Scenarios
Practice Task 1: Geographic Performance Tiers
Objective: Group continents/regions by sales performance
Your Steps:
1. Create visual: Total Sales by Geography[ContinentName]
2. Identify top 2 continents (typically North America, Europe)
3. Group as “Primary Markets”
4. Group remaining as “Emerging Markets”
5. Create KPI card showing sales difference between groups
Create This Measure:
Primary Markets Sales =
CALCULATE(
[Total Sales],
'Geography'[ContinentName (groups)] = "Primary Markets"
)Practice Task 2: Sales Amount Range Analysis
Objective: Understand transaction value distribution
Your Steps:
1. Create bins for Sales[SalesAmount] with bin size = 500
2. Rename field to “Transaction Size Tiers”
3. Create column chart: Count of transactions by tier
4. Add line overlay: Total revenue by tier
5. Identify sweet spot: which tier has best volume × value?
Create This Measure:
Transaction Count = COUNTROWS(Sales)
Average Transaction = DIVIDE([Total Sales], [Transaction Count])Practice Task 3: Seasonal Sales Binning
Objective: Group months by sales performance
Your Steps:
1. Create visual: Total Sales by Calendar[MonthName]
2. Identify peak months (Nov, Dec, Jan) → Group as “Peak Season”
3. Identify shoulder months (Mar, Apr, Sep, Oct) → Group as “Shoulder Season”
4. Remaining months → “Off Season”
5. Calculate seasonal performance variance
Create This Measure:
Peak Season Sales =
CALCULATE(
[Total Sales],
'Calendar'[MonthName (groups)] = "Peak Season"
)Practice Task 4: Store Type Analysis with Bins
Objective: Analyze store performance by size
Your Steps:
1. Create bins for Store[AreaSize] with 5 bins
2. Name categories: XS, S, M, L, XL
3. Create scatter chart:
- X-axis: AreaSize bins
- Y-axis: [Total Sales]
- Size: [Profit]
- Legend: Store[StoreType]
4. Identify: Does larger store = more sales?
🎯 Advanced Contoso Techniques
Technique 1: Multi-Level Grouping
Create Hierarchical Customer Segments:
Step 1: Group by YearlyIncome - Low Income: < $50K - Middle Income: $50K-100K - High Income: > $100K
Step 2: Group by TotalChildren - No Children: 0 - Small Family: 1-2 - Large Family: 3+
Step 3: Cross-analyze - Create matrix with income groups (rows) × family size groups (columns) - Values: Total Sales, Average Purchase, Customer Count
Technique 2: Dynamic Bins with Parameters
Create Parameter for Flexible Binning:
- Modeling tab → New Parameter
- Name: “Income Bin Size”
- Data type: Whole number
- Minimum: 10000
- Maximum: 50000
- Increment: 5000
- Default: 25000
- Use parameter value when creating bins
- Add parameter slicer to report
- Users can adjust income brackets dynamically!
Technique 3: Conditional Grouping with DAX
Create Calculated Column for Automatic Grouping:
Store Performance Tier =
VAR StoreSales =
CALCULATE(
SUM(Sales[SalesAmount]),
ALLEXCEPT(Sales, Store[StoreName])
)
RETURN
SWITCH(
TRUE(),
StoreSales > 5000000, "Tier 1 - Flagship",
StoreSales > 2000000, "Tier 2 - Core",
StoreSales > 500000, "Tier 3 - Standard",
"Tier 4 - Developing"
)Use this in slicers, filters, and visuals!
Technique 4: Advanced Binning with Calculated Columns
Create Custom Age Bins from BirthDate:
Customer Age Group =
VAR CustomerAge =
YEAR(TODAY()) - YEAR(Customer[BirthDate])
RETURN
SWITCH(
TRUE(),
CustomerAge < 25, "Gen Z (18-24)",
CustomerAge < 40, "Millennials (25-39)",
CustomerAge < 55, "Gen X (40-54)",
CustomerAge < 70, "Baby Boomers (55-69)",
"Seniors (70+)"
)Technique 5: Product Price Tier Grouping
Automatic Product Segmentation:
Product Price Tier =
VAR ProductPrice = Product[UnitPrice]
RETURN
SWITCH(
TRUE(),
ProductPrice < 50, "Budget ($0-$50)",
ProductPrice < 200, "Mid-Range ($50-$200)",
ProductPrice < 500, "Premium ($200-$500)",
ProductPrice < 1000, "Luxury ($500-$1000)",
"Ultra-Luxury ($1000+)"
)Technique 6: Sales Velocity Binning
Identify Fast, Medium, and Slow-Moving Products:
Product Velocity =
VAR ProductSalesQty =
CALCULATE(
SUM(Sales[SalesQuantity]),
ALLEXCEPT(Sales, Product[ProductKey])
)
RETURN
SWITCH(
TRUE(),
ProductSalesQty > 10000, "Fast-Moving",
ProductSalesQty > 5000, "Medium-Moving",
ProductSalesQty > 1000, "Slow-Moving",
"Dead Stock"
)✍️ PL-300 Practice Questions (Contoso Context)
Question 1
You create a group of stores with sales greater than $5M in the Contoso dataset. After refreshing your data, a new store opens with sales of $6M. What happens to this store?
A) It must be manually added to the group
B) It automatically appears in the “Other” group
C) It creates a new group automatically
D) It’s excluded from all visuals
Answer: B - It automatically appears in the “Other” group. New data always goes to the “Other” group until manually reassigned.
Explanation: When you create manual groups in Power BI, any new values that appear after a data refresh are automatically placed in the “Other” group. This prevents data loss but requires you to periodically review and update your groups to include new high-performing entities.
Question 2
You want to analyze Contoso customer purchases by creating equal-sized groups based on YearlyIncome ranging from $10K to $150K. You want exactly 7 income brackets. Which approach should you use?
A) Manual grouping with Ctrl+Click on customer income values
B) Create bins with “Size of bins” = 20000
C) Create bins with “Number of bins” = 7
D) Create a calculated column with SWITCH function
Answer: C - Create bins with “Number of bins” = 7. This automatically divides the range into 7 equal intervals.
Explanation: When you specify “Number of bins”, Power BI automatically calculates the bin size by dividing the range (max - min) by the number of bins you specify. This ensures equal-sized intervals. Option B might work but wouldn’t guarantee exactly 7 bins depending on the range.
Question 3
After creating a group called “Premium Categories” from the Product[Category] field in Contoso, where will you find this new grouped field?
A) Only in the visual where you created it
B) In the Fields pane as “Category (groups)”
C) In a new table called “Groups”
D) Only in the Filters pane
Answer: B - In the Fields pane as “Category (groups)”. Grouped fields are added to the data model with “(groups)” suffix.
Explanation: When you create a group, Power BI adds it as a new field to the source table in your data model. It appears in the Fields pane with “(groups)” appended to the original field name. This makes it reusable across all visuals in your report.
Question 4
You create bins for Sales[SalesAmount] in Contoso. Which of these fields CANNOT be binned?
A) Product[UnitCost]
B) Store[AreaSize]
C) Product[Category]
D) Customer[YearlyIncome]
Answer: C - Product[Category]. Binning only works with numerical and date fields, not text fields.
Explanation: Binning is designed to create equal-sized intervals from continuous data. Text fields like Category are discrete and categorical, making them unsuitable for binning. For text fields, use manual grouping instead.
Question 5
In Contoso analysis, you’ve grouped stores into “High Performers” and “Standard Performers.” You want to use this grouping in a slicer, a matrix, and a card visual. How many times do you need to create the group?
A) Once - the group can be reused across multiple visuals
B) Three times - once for each visual
C) Twice - once for slicer, once for visuals
D) Four times - including one for the data model
Answer: A - Once - the group can be reused across multiple visuals. Groups become part of the data model and are available everywhere.
Explanation: This is a key advantage of groups over filters. Once created, a group becomes a permanent field in your data model, available for use in unlimited visuals, measures, and calculations throughout your report.
Question 6
You need to analyze product profitability in Contoso. You have created bins for Product[UnitCost] with 5 bins. Later, you decide you want 8 bins instead. What should you do?
A) Delete the binned field and create a new one with 8 bins
B) Right-click the binned field and select “Edit Groups” to change from 5 to 8 bins
C) Create a new binned field and delete the old one afterward
D) Use a DAX measure to override the bin count
Answer: B - Right-click the binned field and select “Edit Groups” to change from 5 to 8 bins.
Explanation: You can edit existing bin configurations without recreating them. Right-click the binned field in the Fields pane or in the visual’s field well, select “Edit Groups”, and adjust the bin settings as needed.
Question 7
In the Contoso dataset, you want to group Calendar[MonthName] into seasons. Which type of grouping is most appropriate?
A) Binning with 4 bins
B) Manual grouping by selecting months in a visual
C) Creating a calculated column with SWITCH function
D) Both B and C are appropriate
Answer: D - Both B and C are appropriate.
Explanation: For seasonal grouping, you can either: - Use manual grouping: Select months in a visual (Dec, Jan, Feb) and group as “Winter” - Use calculated column: More permanent and automatic, updates with new data Choice depends on whether you want flexibility (manual) or automation (calculated column).
Question 8
You create a group of top-performing products in Contoso and name it “Star Products.” A colleague asks you to share this group with another report. What should you do?
A) Recreate the group manually in the new report
B) Copy the grouped field from the Fields pane and paste it into the new report
C) The group only exists in the current .pbix file and must be recreated
D) Export the group definition to XML and import it
Answer: C - The group only exists in the current .pbix file and must be recreated.
Explanation: Groups are specific to the report file (.pbix) where they’re created. They’re not part of the underlying dataset. To use the same grouping logic in another report, you should create a calculated column with the grouping logic, which becomes part of the data model.
Question 9
You want to create bins for Customer[YearlyIncome] that automatically adjust based on the data range. Currently, income ranges from $10K to $150K. If new data comes in with incomes up to $200K, what happens?
A) The bin ranges automatically recalculate to include $200K
B) Values over $150K are excluded from the binned field
C) You must manually edit the bins to include the new range
D) An error occurs and the visual breaks
Answer: A - The bin ranges automatically recalculate to include $200K.
Explanation: When you don’t specify min/max values, Power BI automatically detects the range from your data and adjusts bin boundaries accordingly. This makes binning dynamic and responsive to data changes.
Question 10
In Contoso, you’ve created these groups for Store[StoreType]: “Online” → “Digital”, “Reseller” → “Partner Channel”, “Store” → “Retail Stores”. Where is this mapping stored?
A) In a hidden table called “_Groups”
B) As metadata in the original StoreType field
C) In the data model as a new field “StoreType (groups)”
D) In the .pbix file settings, not in the data model
Answer: C - In the data model as a new field “StoreType (groups)”.
Explanation: Groups are stored as a new field in the same table as the source field. The mapping between original values and group names is maintained in the data model, making it queryable and usable in DAX.
Question 11
You need to create a visualization showing transaction counts across different sales amount ranges: $0-100, $100-500, $500-1000, $1000-5000, $5000+. These ranges are NOT equal in size. What should you use?
A) Binning with “Number of bins” = 5
B) Binning with “Size of bins”
C) Manual grouping after creating a visual
D) A calculated column with custom logic
Answer: D - A calculated column with custom logic.
Explanation: Standard binning creates equal-sized intervals. For custom, non-equal ranges, use a calculated column with SWITCH or IF logic. Manual grouping won’t work well here because you’re working with continuous numeric data, not discrete values.
Question 12
After creating bins for Sales[SalesAmount], you notice the binned field shows ranges like “0 - 500”, “500 - 1000”, etc. A user asks if a sale of exactly $500 appears in both bins. How do bins handle boundary values?
A) The value appears in both bins
B) Lower bound is inclusive, upper bound is exclusive [0, 500)
C) Upper bound is inclusive, lower bound is exclusive (0, 500]
D) You can configure this in the bin settings
Answer: B - Lower bound is inclusive, upper bound is exclusive [0, 500).
Explanation: Power BI bins use the convention of [min, max), meaning the minimum value is included but the maximum is excluded. A sale of exactly $500 would be in the [500, 1000) bin, not the [0, 500) bin.
Question 13
You want to compare “This Year Sales” vs “Last Year Sales” for your grouped store categories (Flagship vs Standard). You’ve created the store groups. What’s the most efficient approach?
A) Create separate groups for each year
B) Use the same group with time intelligence measures
C) Create a matrix with groups on rows and years on columns
D) Both B and C are efficient approaches
Answer: D - Both B and C are efficient approaches.
Explanation: Groups work seamlessly with time intelligence. You can either:
- Create measures like LY Sales = CALCULATE([Total Sales], SAMEPERIODLASTYEAR(Calendar[Date])) and use with groups
- Use groups in a matrix with years as columns
Both leverage the same group definition efficiently.
Question 14
In Contoso, you’ve binned Product[UnitCost] and want to calculate the average profit margin for each cost bin. Which approach is correct?
A) Use the binned field in a matrix with Average(Profit Margin %)
B) Create a measure that references the binned field
C) Use AVERAGEX over the binned field
D) All of the above can work
Answer: D - All of the above can work.
Explanation: Binned fields work like any other grouping field. You can: - Use them directly in visuals with aggregated measures - Reference them in DAX measures as a filter context - Use them in iterator functions like AVERAGEX The choice depends on your specific calculation requirements.
Question 15
You’ve created multiple groups: Store performance tiers, Product category groups, and Customer income bins. A manager asks: “Can we filter the entire report by Premium Products only?” What’s the best solution?
A) Create a report-level filter using the product group
B) Add the product group to a slicer on each page
C) Use the product group in a Sync Slicer across all pages
D) Create a bookmark for Premium Products view
Answer: C - Use the product group in a Sync Slicer across all pages.
Explanation: Sync Slicers provide the best user experience for filtering across multiple pages. While report-level filters work, they’re hidden from users. A synced slicer is visible, interactive, and maintains state across pages, making it ideal for user-driven filtering.
🔬 Complete Hands-On Lab with Contoso
Lab Setup (15 minutes)
Download and Load: 1. Open Power BI Desktop 2. Get Data → Samples → Contoso Sales Sample 3. Load all tables 4. Verify relationships in Model view
Create Base Measures: Go to Modeling tab → New Measure and create each of these:
Verify Measures Work:
- Create a Card visual
- Add [Total Sales] measure
- Should show total across all data
- Repeat for other measures
Lab Exercise 1: Store Performance Grouping (20 minutes)
Objective: Segment stores into performance tiers for strategic planning
Checklist: - [ ] Create bar chart: Total Sales by StoreName - [ ] Sort by Total Sales (descending) - [ ] Identify top 6 stores (sales > $4M) - [ ] Hold Ctrl and click each top store - [ ] Right-click → Group Data - [ ] Right-click group → Edit Groups - [ ] Rename first group to “Flagship Stores” - [ ] Rename “Other” to “Regional Stores” - [ ] Click OK to save
Create Supporting Visuals:
- [ ] Insert Donut Chart
- Legend: StoreName (groups)
- Values: [Total Sales]
- Format data labels to show percentage
Flagship Sales =
CALCULATE(
[Total Sales],
Store[StoreName (groups)] = "Flagship Stores"
)
Regional Sales =
CALCULATE(
[Total Sales],
Store[StoreName (groups)] = "Regional Stores"
)
Flagship vs Regional =
[Flagship Sales] - [Regional Sales]StoreName (groups)Validation Criteria: ✅ Flagship stores represent 60-70% of total sales ✅ Group field appears in Fields pane ✅ Visuals update when slicer changes ✅ Group names are business-friendly
Analysis Questions to Answer: 1. What percentage of total sales come from Flagship stores? 2. How many stores are in each tier? 3. What’s the average sales per store in each tier? 4. Should we invest in upgrading Regional stores or opening new Flagship stores?
Lab Exercise 2: Customer Income Binning (20 minutes)
Objective: Understand customer segmentation by income levels
Checklist:
- [ ] In Fields pane, expand Customer table
- [ ] Right-click YearlyIncome
- [ ] Select “New Group”
- [ ] Select “Bin” as group type
- [ ] Choose “Size of bins”
- [ ] Enter 20000 as bin size
- [ ] Click OK
- [ ] Verify YearlyIncome (bins) appears in Fields
Create Analysis Dashboard:
Visual 1: Income Distribution
- [ ] Insert Clustered Column Chart
- [ ] X-axis: YearlyIncome (bins)
- [ ] Y-axis: Create measure:
DAX Customer Count = DISTINCTCOUNT(Sales[CustomerKey])
- [ ] Format X-axis labels as currency
- [ ] Add data labels
Visual 2: Revenue by Income Tier
- [ ] Insert Line and Clustered Column Chart
- [ ] X-axis: YearlyIncome (bins)
- [ ] Column values: [Customer Count]
- [ ] Line values: [Total Sales]
- [ ] Add secondary Y-axis for Total Sales
Visual 3: Income Segment Performance Table
- [ ] Insert Table visual
- [ ] Add columns:
- YearlyIncome (bins)
- [Customer Count]
- [Total Sales]
- Create measure:
DAX Avg Sales per Customer = DIVIDE([Total Sales], [Customer Count], 0)
- Create measure:
DAX Avg Transaction per Customer = DIVIDE([Transaction Count], [Customer Count], 0)
- [ ] Sort by Total Sales descending
Advanced Analysis:
- [ ] Create a scatter plot:
- X-axis: YearlyIncome (bins)
- Y-axis: [Avg Sales per Customer]
- Size: [Customer Count]
- Tooltips: Add [Profit Margin %]
Validation Criteria: ✅ You should see 6-8 income bins ✅ Bins range from ~$10K to $150K+ ✅ Middle income brackets have highest customer count ✅ Higher income brackets have higher avg sales per customer
Analysis Questions: 1. Which income bracket has the most customers? 2. Which bracket generates the most total revenue? 3. What’s the average purchase value in each bracket? 4. How should marketing budgets be allocated across brackets?
Lab Exercise 3: Product Category Tiers (25 minutes)
Objective: Classify products by profitability for portfolio management
Preparation:
- [ ] Ensure you have the Profit Margin % measure:
DAX Profit Margin % = VAR TotalSales = SUM(Sales[SalesAmount]) VAR TotalCost = SUMX(Sales, Sales[SalesQuantity] * RELATED(Product[UnitCost])) VAR Profit = TotalSales - TotalCost RETURN DIVIDE(Profit, TotalSales, 0) * 100
Step 1: Analyze Category Performance
- [ ] Insert Matrix visual
- [ ] Rows: Product[Category]
- [ ] Values: [Total Sales], [Profit], [Profit Margin %]
- [ ] Apply conditional formatting to Profit Margin %
- [ ] Identify categories with margin > 35%
Step 2: Create Margin-Based Groups
- [ ] Insert Clustered Bar Chart
- [ ] Axis: Product[Category]
- [ ] Values: [Profit Margin %]
- [ ] Sort descending
- High Margin (>35%): Typically Audio, Cameras, Computers
- Low Margin (<15%): Typically some electronics or accessories
- Medium Margin: Everything else
Step 3: Create Portfolio Analysis
- [ ] Insert Stacked Bar Chart
- Axis: Category (groups)
- Values: [Total Sales]
- Legend: Product[SubCategory]
Premium Category Sales =
CALCULATE(
[Total Sales],
Product[Category (groups)] = "Premium Categories"
)
Standard Category Sales =
CALCULATE(
[Total Sales],
Product[Category (groups)] = "Standard Categories"
)
Value Category Sales =
CALCULATE(
[Total Sales],
Product[Category (groups)] = "Value Categories"
)Step 4: Create BCG Matrix Analysis Create this calculated column:
- X-axis:
[Total Sales] - Y-axis:
[Profit Margin %] - Legend:
[BCG Classification] - Size:
[Total Quantity]
Validation Criteria: ✅ Three distinct category groups created ✅ Premium categories show higher margins ✅ Each group shows different sales volumes ✅ BCG classification provides actionable insights
Lab Exercise 4: Transaction Size Analysis (20 minutes)
Objective: Understand transaction value distribution and identify optimal pricing
Step 1: Create Transaction Bins
- [ ] Right-click Sales[SalesAmount]
- [ ] New Group → Bin
- [ ] Size of bins: 1000
- [ ] Click OK
- [ ] Field created: SalesAmount (bins)
Step 2: Build Histogram
- [ ] Insert Column Chart
- [ ] X-axis: SalesAmount (bins)
- [ ] Y-axis: [Transaction Count] measure
- [ ] Format X-axis as currency
- [ ] Add data labels
- [ ] Title: “Transaction Value Distribution”
Step 3: Revenue Contribution Analysis
- [ ] Insert Line and Stacked Column Chart
- [ ] X-axis: SalesAmount (bins)
- [ ] Column Y-axis: [Transaction Count]
- [ ] Line Y-axis: [Total Sales]
- [ ] Format line as % of total
Step 4: Create Summary Table - [ ] Insert Table - [ ] Columns: ```DAX Transaction Range = VALUES(Sales[SalesAmount (bins)])
Transaction Volume = [Transaction Count]
Revenue Contribution = [Total Sales]
% of Total Transactions = DIVIDE( [Transaction Count], CALCULATE([Transaction Count], ALL(Sales[SalesAmount (bins)])), 0 ) * 100
% of Total Revenue = DIVIDE( [Total Sales], CALCULATE([Total Sales], ALL(Sales[SalesAmount (bins)])), 0 ) * 100
Avg Items per Transaction = DIVIDE([Total Quantity], [Transaction Count], 0) ```
Step 5: Cumulative Analysis
- [ ] Create Pareto chart showing:
DAX Cumulative Revenue % = VAR CurrentSales = [Total Sales] VAR AllSales = CALCULATE([Total Sales], ALL(Sales[SalesAmount (bins)])) VAR RankPosition = RANKX(ALL(Sales[SalesAmount (bins)]), [Total Sales],, DESC) VAR CumulativeSales = CALCULATE( [Total Sales], FILTER( ALL(Sales[SalesAmount (bins)]), RANKX(ALL(Sales[SalesAmount (bins)]), [Total Sales],, DESC) <= RankPosition ) ) RETURN DIVIDE(CumulativeSales, AllSales, 0) * 100
Validation Criteria: ✅ Histogram shows right-skewed distribution ✅ Most transactions cluster in $500-$3000 range ✅ 20% of transaction ranges drive 80% of revenue ✅ Clear identification of sweet spot pricing
Analysis Questions: 1. What’s the most common transaction size? 2. Which transaction ranges drive the most revenue? 3. Are high-value transactions frequent enough? 4. Should we bundle products to move customers to higher transaction tiers?
Lab Exercise 5: Seasonal Performance Grouping (20 minutes)
Objective: Identify seasonal patterns and optimize inventory/marketing
Step 1: Monthly Sales Analysis
- [ ] Insert Clustered Bar Chart
- [ ] Axis: Calendar[MonthName]
- [ ] Values: [Total Sales]
- [ ] Sort by Calendar[MonthKey] (to get chronological order)
Step 2: Create Seasonal Groups Identify and group months:
- Ctrl+Click these months
- Right-click → Group Data
- Name: “Holiday Season”
- Ctrl+Click these months
- Right-click → Group Data
- Name: “Summer Season”
- Ctrl+Click these months
- Right-click → Group Data
- Name: “Spring Season”
- Ctrl+Click these months
- Right-click → Group Data
- Name: “Back-to-School”
- Leave as “Other” or create separate group
Step 3: Seasonal Performance Dashboard
Visual 1: Seasonal Revenue Contribution
- [ ] Insert Donut Chart
- [ ] Legend: MonthName (groups)
- [ ] Values: [Total Sales]
- [ ] Show percentages
Visual 2: YoY Seasonal Comparison
- [ ] Insert Clustered Column Chart
- [ ] Axis: MonthName (groups)
- [ ] Legend: Calendar[Year]
- [ ] Values: [Total Sales]
Visual 3: Seasonal KPIs Create measures for each season:
Visual 4: Seasonal Trend Line
- [ ] Insert Line Chart
- [ ] Axis: Calendar[Date] (at month level)
- [ ] Values: [Total Sales]
- [ ] Legend: MonthName (groups)
- [ ] Add forecast for next 6 months
Step 4: Product Performance by Season
- [ ] Insert Matrix
- [ ] Rows: Product[Category]
- [ ] Columns: MonthName (groups)
- [ ] Values: [Total Sales]
- [ ] Apply heat map conditional formatting
Validation Criteria: ✅ Holiday Season = 35-40% of annual sales ✅ Clear seasonal patterns visible ✅ YoY growth trends identified ✅ Product-season relationships mapped
Strategic Questions: 1. Which season needs marketing boost? 2. What inventory levels needed per season? 3. Are there cross-sell opportunities between seasons? 4. Should we create season-specific promotions?
📈 Real-World Contoso Business Scenarios
Scenario 1: Store Expansion Strategy
Business Context: CFO asks: “We have budget to open 5 new stores. Based on current performance, what type and size should they be?”
Your Analysis Plan:
Step 1: Store Type Performance
- Group stores by Store[StoreType] (Catalog, Reseller, Store)
- Compare metrics:
- Total Sales
- Profit Margin %
- Sales per Square Foot
- Customer Count
Step 2: Store Size Analysis
- Create bins for Store[AreaSize] (5 bins)
- Label: “Micro”, “Small”, “Medium”, “Large”, “XL”
- Calculate ROI by size:
```DAX
Sales per SqFt =
DIVIDE(
[Total Sales],
SUM(Store[AreaSize]),
0
)
Store ROI Tier = SWITCH( TRUE(), [Sales per SqFt] > 1000, “Excellent”, [Sales per SqFt] > 750, “Good”, [Sales per SqFt] > 500, “Average”, “Below Average” ) ```
Step 3: Cross-Analysis Matrix - Create matrix: Store Type (rows) × Size Category (columns) - Values: Avg Sales, Avg Profit, Avg ROI - Identify winning combinations
Step 4: Geographic Performance - Group continents: - “Mature Markets”: North America, Europe - “Growth Markets”: Asia, South America - “Emerging Markets”: Others - Recommend expansion geography
Deliverable: Report answering: - ✅ Optimal store type - ✅ Recommended size - ✅ Target geographies - ✅ Expected ROI - ✅ Investment timeline
Scenario 2: Product Portfolio Rationalization
Business Context: CMO asks: “We have too many SKUs. Which products should we discontinue, which should get more investment?”
Your Analysis Plan:
Step 1: Product Classification Create calculated column:
Step 2: Category Analysis - Group categories by margin tiers (as done in Exercise 3) - Bin categories by sales velocity - Identify: - Categories to expand - Categories to optimize - Categories to phase out
Step 3: Inventory Turnover Create bins for:
Days to Sell =
DIVIDE(
365,
DIVIDE(
[Total Quantity],
DISTINCTCOUNT(Sales[DateKey]),
0
),
0
)Bins: 0-30 days (Fast), 31-60 (Medium), 61-90 (Slow), 90+ (Dead Stock)
Step 4: Profitability per SKU - Create scatter plot: - X: Total Sales per Product - Y: Profit Margin % per Product - Size: Inventory Turnover - Color: Product Strategy Quadrant
Deliverable: - ✅ List of products to discontinue (with phase-out plan) - ✅ List of products for increased investment - ✅ Pricing optimization opportunities - ✅ Expected impact on profitability
Scenario 3: Customer Lifetime Value Optimization
Business Context: Head of Sales asks: “How should we segment customers for our new loyalty program tiers?”
Your Analysis Plan:
Step 1: Multi-Dimensional Customer Binning
Income Segmentation:
- Bin Customer[YearlyIncome] (5 bins)
- Label: “Entry”, “Core”, “Premium”, “Luxury”, “Elite”
Purchase Frequency: Create calculated column:
Customer Purchase Frequency =
VAR CustomerTransactions =
CALCULATE(
DISTINCTCOUNT(Sales[OrderNumber]),
ALLEXCEPT(Sales, Customer[CustomerKey])
)
RETURN
SWITCH(
TRUE(),
CustomerTransactions > 20, "Very Frequent",
CustomerTransactions > 10, "Frequent",
CustomerTransactions > 5, "Occasional",
"Rare"
)Lifetime Value Bins:
Customer Lifetime Value =
CALCULATE(
[Total Sales],
ALLEXCEPT(Sales, Customer[CustomerKey])
)Create bins: $0-1K, $1K-5K, $5K-10K, $10K-25K, $25K+
Step 2: RFM Analysis with Groups Create these calculated columns:
Step 3: Loyalty Tier Recommendation - Group customers into loyalty tiers based on RFM + CLV - Bronze: Entry-level, occasional purchasers - Silver: Regular customers, mid-value - Gold: Frequent buyers, high value - Platinum: Champions, highest value
Step 4: Benefit Structure by Tier Create analysis showing: - Current customer count per tier - Revenue contribution per tier - Recommended benefits budget per tier - Expected tier migration paths
Deliverable: - ✅ Customer segmentation model - ✅ Loyalty tier definitions - ✅ Recommended benefits per tier - ✅ Financial impact projection - ✅ Implementation roadmap
Scenario 4: Inventory Optimization by Channel
Business Context: COO asks: “We’re overstocked in some categories and understocked in others. How should we allocate inventory across online vs retail?”
Your Analysis Plan:
Step 1: Channel Performance Groups
- Group Store[StoreType]:
- “Digital”: Online, Catalog
- “Physical”: Store, Reseller
- Compare sales velocity by channel
Step 2: Product Velocity Binning
Step 3: Channel-Product Matrix - Create matrix: Product Velocity (rows) × Channel (columns) - Values: Total Sales, Inventory Turnover, Stockout Rate - Identify mismatches: - Fast products with low inventory - Slow products with high inventory
Step 4: Seasonality Impact - Use seasonal groups from Exercise 5 - Cross-analyze: Season × Velocity × Channel - Identify seasonal stocking patterns
Step 5: Optimization Recommendations Create calculated measures:
Deliverable: - ✅ Inventory reallocation plan - ✅ Reorder quantities by product-channel - ✅ Expected reduction in carrying costs - ✅ Projected improvement in stockout rate - ✅ Implementation timeline
⚙️ Advanced DAX Techniques for Grouping/Binning
Dynamic Grouping with User Input
Create Parameter-Driven Groups:
Dynamic Revenue Tier =
VAR HighThreshold = [Revenue Threshold Parameter Value] // e.g., 5000000
VAR MidThreshold = HighThreshold * 0.4 // 40% of high threshold
RETURN
SWITCH(
TRUE(),
[Total Sales] >= HighThreshold, "High Revenue",
[Total Sales] >= MidThreshold, "Medium Revenue",
"Low Revenue"
)Percentile-Based Binning
Group Based on Distribution:
Time-Based Dynamic Groups
Create Rolling Period Groups:
Multi-Condition Grouping
Combine Multiple Criteria:
Conditional Aggregation with Groups
Calculate Different Metrics by Group:
Weighted Performance Score =
VAR StoreGroup = SELECTEDVALUE(Store[StoreName (groups)])
RETURN
SWITCH(
StoreGroup,
"Flagship Stores",
([Total Sales] * 0.4) + ([Profit] * 0.3) + ([Customer Count] * 100 * 0.3),
"Regional Stores",
([Total Sales] * 0.5) + ([Profit] * 0.3) + ([Customer Count] * 50 * 0.2),
[Total Sales] * 0.6 + [Profit] * 0.4
)Year-over-Year Growth by Group
YoY Sales Growth % by Store Tier =
VAR CurrentYear = MAX(Calendar[Year])
VAR PreviousYear = CurrentYear - 1
VAR CurrentYearSales =
CALCULATE(
[Total Sales],
Calendar[Year] = CurrentYear
)
VAR PreviousYearSales =
CALCULATE(
[Total Sales],
Calendar[Year] = PreviousYear
)
RETURN
DIVIDE(
CurrentYearSales - PreviousYearSales,
PreviousYearSales,
0
) * 100Moving Customers Between Groups
Track Group Migration:
🎨 Visualization Best Practices for Groups and Bins
Best Visual Types by Use Case
For Comparing Groups: - ✅ Clustered Bar Chart (easy comparison) - ✅ Donut/Pie Chart (part-to-whole relationships) - ✅ Treemap (hierarchical groups) - ❌ Scatter plot (unless showing correlation)
For Showing Bin Distributions: - ✅ Column Chart (histogram) - ✅ Line Chart (trend across bins) - ✅ Area Chart (cumulative distribution) - ❌ Pie chart (too many slices)
For Cross-Tabulation: - ✅ Matrix (detailed numbers) - ✅ Heat map (pattern identification) - ✅ Clustered column chart (comparison) - ❌ Single value cards
Color Coding Standards
For Performance Tiers:
High/Premium/Flagship: Blue (#0078D4)
Medium/Standard: Gray (#767676)
Low/Value: Orange (#FF8C00)For Traffic Light Status:
Good/Exceeds: Green (#107C10)
Warning/On Track: Yellow (#FFB900)
Critical/Below: Red (#E81123)For Bins: - Use gradient colors (light to dark) - Maintain consistent hue - Increase saturation with value
Formatting Bin Labels
Currency Bins:
Instead of: 0 - 1000
Use: $0 - $1K
Instead of: 1000 - 2000
Use: $1K - $2KPercentage Bins:
Instead of: 0 - 0.15
Use: 0% - 15%
Instead of: 0.15 - 0.25
Use: 15% - 25%Date Bins:
Instead of: 1/1/2023 - 3/31/2023
Use: Q1 2023
Instead of: 1 - 30
Use: Days 1-30⚠️ Common Mistakes to Avoid
❌ Mistake 1: Over-Binning
Problem: Creating 15-20 bins makes visualization unreadable
Example of Bad Binning:
Sales[SalesAmount] with bin size = $100
Results in 50+ bins from $0 to $5000Solution: Use 3-7 bins maximum
Sales[SalesAmount] with 5 bins
Results in: $0-1K, $1K-2K, $2K-3K, $3K-4K, $4K+Rule of Thumb: If you can’t see all bin labels at once, you have too many bins.
❌ Mistake 2: Grouping Without Analysis
Problem: Creating groups before understanding data distribution
Bad Approach:
1. Immediately group top 3 stores as "Flagship"
2. Group everything else as "Other"
3. Create dashboardGood Approach:
1. Analyze sales distribution across all stores
2. Identify natural breakpoints (e.g., >$5M, $2M-$5M, <$2M)
3. Validate groups make business sense
4. Create meaningful tier names
5. Build dashboard with insights❌ Mistake 3: Inconsistent Group Names
Problem: Using technical names that users don’t understand
Bad Names:
- Group 1, Group 2, Group 3
- Other
- Store Type A, Store Type B
- Bin 0-1000, Bin 1000-2000Good Names:
- Flagship Stores, Regional Stores
- High Performers, Standard Performers
- Premium Products, Value Products
- Entry Level ($0-$1K), Mid-Range ($1K-$5K)❌ Mistake 4: Forgetting to Update Groups
Problem: Groups become outdated as data changes
Example:
Month 1: Top 5 stores grouped as "Flagship"
Month 6: Original top stores decline, new stores rise
Dashboard: Still showing old groupingSolution Options: 1. Manual Review: Monthly review and update groups 2. Calculated Column: Dynamic grouping with DAX
Dynamic Store Tier =
VAR StoreSales = [Total Sales by Store]
VAR TopTierThreshold = 5000000
RETURN
IF(StoreSales >= TopTierThreshold, "Flagship", "Regional")❌ Mistake 5: Mixing Aggregation Levels
Problem: Grouping at different granularities causes confusion
Bad Example:
Visual with:
- Category Groups (Product level)
- Store Groups (Store level)
- Customer Groups (Customer level)
Result: Cross-join explosion, slow performanceGood Example:
Visual 1: Product Categories (Product level only)
Visual 2: Store Tiers (Store level only)
Visual 3: Customer Segments (Customer level only)
Visual 4: Matrix showing Store Tier × Product Category (appropriate cross-tabulation)❌ Mistake 6: Not Handling Nulls in Bins
Problem: Missing values create incomplete bins
Example:
Customer[YearlyIncome] has 10% null values
Bins created: All nulls go to "Other"
Result: Misleading distributionSolution:
Clean Income for Binning =
IF(
ISBLANK(Customer[YearlyIncome]),
0, // or use MEDIAN(Customer[YearlyIncome])
Customer[YearlyIncome]
)Then bin the cleaned field instead.
❌ Mistake 7: Confusing Groups with Filters
Problem: Using groups when filters would be more appropriate
When to Use Groups: - Need to see grouped data side-by-side - Want to aggregate across multiple values - Need to create new analytical dimension
When to Use Filters: - Want to focus on specific subset - Need to exclude certain values - Temporarily changing scope
❌ Mistake 8: Creating Bins on Calculated Measures
Problem: Trying to bin a measure instead of a column
This Won’t Work:
Right-click [Total Sales] measure → New Group → Bin
Error: Can only bin columns, not measuresSolution:
// Create calculated column first
Store Total Sales =
CALCULATE(
SUM(Sales[SalesAmount]),
ALLEXCEPT(Sales, Store[StoreKey])
)Then bin the calculated column.
✅ Comprehensive Study Checklist
Conceptual Understanding
Technical Skills - Grouping
Technical Skills - Binning
Contoso-Specific Practice
DAX Integration
Visualization Mastery
PL-300 Exam Readiness
📚 Quick Reference Card
Creating Groups - Quick Steps
1. Build visual with dimension field
2. Ctrl + Click to multi-select
3. Right-click → Group Data
4. Edit Groups → Rename
5. Find in Fields pane with "(groups)" suffixCreating Bins - Quick Steps
1. Right-click numeric field in Fields pane
2. New Group
3. Select "Bin" type
4. Choose: Size of bins OR Number of bins
5. Enter value → OK
6. Find in Fields pane with "(bins)" suffixCommon DAX Patterns
Filter by Group:
Flagship Sales =
CALCULATE([Total Sales], Store[StoreName (groups)] = "Flagship Stores")Dynamic Grouping:
Performance Tier = SWITCH(TRUE(), [Total Sales] > 5000000, "High", "Low")Count by Group:
High Performers Count =
CALCULATE(
COUNTROWS(Store),
Store[Performance Tier] = "High"
)🎓 Final Challenge Project
Executive Dashboard Requirements
Create a comprehensive 4-page dashboard covering:
Page 1: Store Performance Analysis Required Elements: - [ ] Store performance tier groups (3 tiers minimum) - [ ] Sales, profit, and customer metrics by tier - [ ] YoY growth comparison - [ ] Geographic distribution map with tier overlay - [ ] Drill-through to individual store details - [ ] Top 5 performers card - [ ] Bottom 5 requiring attention card
Page 2: Customer Segmentation Required Elements: - [ ] Income bins (5 categories) - [ ] RFM segmentation groups - [ ] Customer count and revenue by segment - [ ] Average transaction value by segment - [ ] Customer lifetime value distribution - [ ] Segment migration analysis (upgraded/downgraded) - [ ] Retention rate by segment
Page 3: Product Portfolio Matrix Required Elements: - [ ] Product category margin groups (3 tiers) - [ ] BCG matrix (Stars, Cash Cows, Dogs, Question Marks) - [ ] Sales velocity bins - [ ] Category performance heat map - [ ] Product count by strategic quadrant - [ ] Recommended actions by quadrant - [ ] Top 10 products by profit contribution
Page 4: Seasonal & Trend Analysis Required Elements: - [ ] Month groups by season (4-5 seasons) - [ ] Sales trend over time with seasonal markers - [ ] YoY seasonal comparison - [ ] Product category performance by season - [ ] Inventory recommendations by season - [ ] Forecast for next quarter - [ ] Seasonal KPIs and targets
Technical Requirements: - [ ] Minimum 8 different groups created - [ ] Minimum 6 different bins created - [ ] All groups have business-friendly names - [ ] Consistent color scheme throughout - [ ] At least 5 DAX measures using groups - [ ] Interactive slicers for key groups - [ ] Professional formatting and layout - [ ] Mobile-optimized layout
Success Criteria: - ✅ Dashboard tells coherent business story - ✅ All groups/bins are actionable - ✅ Visualizations are appropriate for data type - ✅ Dashboard loads in under 3 seconds - ✅ No data quality issues visible - ✅ Clear recommendations for each section - ✅ Could be presented to C-level executives
🏆 Mastery Assessment
Rate yourself honestly (1-5, where 5 is mastery):
Conceptual Knowledge [ /5] - Understanding of when to use groups vs bins - Knowledge of group behavior and limitations - Understanding of bin calculation methods
Technical Execution [ /5] - Can create groups efficiently - Can create bins with different configurations - Can edit and maintain groups
DAX Integration [ /5] - Can reference groups in measures - Can create dynamic grouping with calculated columns - Can build complex conditional grouping logic
Business Application [ /5] - Can identify grouping opportunities - Can name groups appropriately - Can build actionable insights from groups
Visualization [ /5] - Chooses appropriate visuals for groups - Formats groups professionally - Creates interactive group-based dashboards
Total Score: [ /25]
Scoring: - 20-25: Ready for PL-300 exam! 🏆 - 15-19: Almost there, review weak areas 📚 - 10-14: Need more practice, complete labs again 💪 - Below 10: Start from beginning, take time to learn 📖
📖 Additional Resources
Microsoft Learn Paths:
- Power BI Data Analyst Associate certification path
- Data modeling in Power BI
- DAX in Power BI Desktop
Practice Resources:
- Contoso dataset (built into Power BI)
- Adventure Works dataset
- Northwind dataset
Recommended Next Steps:
- Complete all 5 lab exercises with Contoso
- Build the Final Challenge Project
- Review and answer all practice questions
- Create 3 real-world scenarios from your work
- Practice explaining concepts to a colleague
- Take PL-300 practice exams
- Schedule your certification exam
🎯 Final Exam Tips
What You MUST Know: 1. Groups are added to the data model 2. “Other” group gets all ungrouped values 3. Groups can be reused across visuals 4. Binning only works on numeric/date fields 5. Bin boundaries are [inclusive, exclusive) 6. Groups update automatically when data refreshes (new values go to “Other”)
Common Exam Question Patterns: - “Where do you find a newly created group?” - “What happens to new data in a group?” - “Which field types can be binned?” - “How do you change bin configuration?” - “What’s the difference between grouping and filtering?”
Time-Saving Tips: - Practice the Ctrl+Click → Group workflow until it’s muscle memory - Remember keyboard shortcuts - Know where to find Edit Groups quickly - Understand the difference between bin types
✨ Congratulations!
You now have a comprehensive guide to mastering Grouping and Binning in Power BI using the Contoso dataset.
Your journey: 1. ✅ Learned core concepts 2. ✅ Practiced with realistic scenarios 3. ✅ Built hands-on skills through 5 detailed exercises 4. ✅ Explored advanced DAX techniques 5. ✅ Studied real-world business applications 6. ✅ Completed practice questions 7. ✅ Prepared for PL-300 certification
Remember: - Practice is key - don’t just read, do! - Start simple, then add complexity - Always think: “Does this grouping make business sense?” - Groups should tell a story and drive decisions
Now get started: Open Power BI Desktop, load Contoso, and begin with Exercise 1!
Good luck with your PL-300 certification! 🚀📊💪
Last Updated: December 2024Document Version: 2.0For: PL-300 Microsoft Power BI Data Analyst CertificationPractice Dataset: Contoso Sales Sample