Business Professionals
Power BI | Power Pivot | Power Query | DAX
Cloud Flows | RPA | AI Builder | Copilot
60+ Formulas | Data Stories | Advanced Reporting & Modeling
VB Programming | Report Automation |
MS-Office Automation
Techno-Business Professionals
Power BI | Power Query | Advanced DAX | SQL - Query &
Programming
Microsoft Fabric | Power BI | Power Query | Advanced DAX |
SQL - Query & Programming
Power BI | Power Apps | Power Automate | Copilot Studio | Power Pages | Dataverse
Microsoft Power Apps | Microsoft Power Automate
Power BI | Adv. DAX | SQL (Query & Programming) |
VBA | Python | Web Scrapping | API Integration
Power BI | Power Apps | Power Automate |
SQL (Query & Programming)
Power BI | Adv. DAX | Power Apps | Power Automate |
SQL (Query & Programming) | VBA | Python | Web Scrapping | API Integration
Power Apps | Power Automate | SQL | VBA | Python |
Web Scraping | RPA | API Integration
Technology Professionals
Power BI | DAX | SQL | ETL with SSIS | SSAS | VBA | Python
Power BI | SQL | Azure Data Lake | Synapse Analytics |
Data Factory | Databricks | Power Apps | Power Automate |
Azure Analysis Services
Microsoft Fabric | Power BI | SQL | Lakehouse |
Data Factory (Pipelines) | Dataflows Gen2 | KQL | Delta Tables | Power Apps | Power Automate
Power BI | Power Apps | Power Automate | SQL | VBA | Python | API Integration
Power BI | Advanced DAX | Databricks | SQL | Lakehouse Architecture
Business Professionals
Power BI | Power Pivot | Power Query | DAX
Cloud Flows | RPA | AI Builder | Copilot
60+ Formulas | Data Stories | Advanced Reporting & Modeling
VB Programming | Report Automation |
MS-Office Automation
Techno-Business Professionals
Power BI | Power Query | Advanced DAX | SQL - Query &
Programming
Microsoft Fabric | Power BI | Power Query | Advanced DAX |
SQL - Query & Programming
Power BI | Power Apps | Power Automate | Copilot Studio | Power Pages | Dataverse
Microsoft Power Apps | Microsoft Power Automate
Power BI | Adv. DAX | SQL (Query & Programming) |
VBA | Web Scrapping | API Integration
Power BI | Power Apps | Power Automate |
SQL (Query & Programming)
Power BI | Adv. DAX | Power Apps | Power Automate |
SQL (Query & Programming) | VBA | Web Scrapping | API Integration
Power Apps | Power Automate | SQL | VBA |
Web Scraping | RPA | API Integration
Technology Professionals
Power BI | DAX | SQL | ETL with SSIS | SSAS | VBA
Power BI | SQL | Azure Data Lake | Synapse Analytics |
Data Factory | Azure Analysis Services
Microsoft Fabric | Power BI | SQL | Lakehouse |
Data Factory (Pipelines) | Dataflows Gen2 | KQL | Delta Tables
Power BI | Power Apps | Power Automate | SQL | VBA | API Integration
Power BI | Advanced DAX | Databricks | SQL | Lakehouse Architecture
Your team just rolled out Fabric and everyone is asking the same thing: “Can Copilot write our DAX now?” You’ve seen Copilot suggest measures in Power BI Desktop, but you’re not sure when to trust it and when it quietly does the wrong thing.
This article walks through 10 real measures from a typical sales model, shows what Copilot actually produced, and how an experienced modeler would adjust or reject each result.
You’re maintaining a Power BI dataset for a regional sales team:
Sales[OrderDate]Sales[InvoiceDate]Sales[Quantity]Sales[NetAmount]Sales[CostAmount]Sales[Channel] (values like Online, Store)Customer[CustomerID], Customer[Segment]The team wants a set of new measures. Instead of writing them manually, you use Copilot in Power BI Desktop to generate DAX from natural language prompts.
Below, I’ll show:
I’m not reproducing Copilot verbatim (that will vary), but each "Copilot" measure reflects patterns Copilot currently tends to produce: heavy use of CALCULATE, reliance on implicit filters, and limited awareness of modelling intent.
Prompt: Create a measure for total net sales amount
Copilot-style output:
Total Sales Amount = SUM ( Sales[NetAmount] )
Verdict: Good.
For a numeric column in a single fact table, Copilot usually gets this right. No need for CALCULATE or SUMX here.
Keep as-is.
Prompt: Create a measure for gross margin in currency
Copilot-style output:
Gross Margin = SUM ( Sales[NetAmount] ) - SUM ( Sales[CostAmount] )
Verdict: Acceptable, but we can tighten it.
This works as long as both columns are in the same table and numeric. The measure is additive and respects filter context.
Some teams prefer wrapping base measures in VARs for readability, but functionally this is fine.
Optional refinement:
Gross Margin =
[Total Sales Amount] - SUM ( Sales[CostAmount] )
This keeps logic aligned with your main revenue measure.
Prompt: Create a measure for gross margin percentage of sales
Copilot-style output:
Gross Margin % =
DIVIDE (
SUM ( Sales[NetAmount] ) - SUM ( Sales[CostAmount] ),
SUM ( Sales[NetAmount] )
)
Verdict: Technically correct.
The use of DIVIDE instead of / is good: it handles divide-by-zero safely and returns BLANK by default. This measure respects filter context and works for visuals by date, customer, channel, etc.
Recommended refinement:
Gross Margin % =
DIVIDE (
[Gross Margin],
[Total Sales Amount]
)
Using base measures keeps definitions consistent and easier to audit.
Prompt: Create a measure for year-to-date total sales using the Date table
Copilot-style output:
Sales YTD =
TOTALYTD (
[Total Sales Amount],
'Date'[Date]
)
Verdict: Correct, assuming:
'Date' is marked as a date table'Date'[Date] is the key date columnTOTALYTD uses the current filter context and the date table to accumulate values from the start of the year up to the max visible date.
Things Copilot won’t check for you:
OrderDate and InvoiceDate, Copilot doesn’t know which business logic you want. The measure above uses whatever Total Sales Amount uses.If you need YTD by invoice date specifically, you must encode that logic yourself, e.g. using a separate date table or mapping.
Prompt: Create a measure for sales in the same period last year
Copilot-style output:
Sales LY =
CALCULATE (
[Total Sales Amount],
SAMEPERIODLASTYEAR ( 'Date'[Date] )
)
Verdict: Correct for standard calendar comparisons.
SAMEPERIODLASTYEAR shifts the current filter on 'Date'[Date] by one year while preserving the shape (e.g. entire year, month-to-date, day-level).
Watch out:
DATEADD on a fiscal-date column or custom logic.Fiscal example (if you have a fiscal date column):
Sales LY Fiscal =
CALCULATE (
[Total Sales Amount],
DATEADD ( 'Date'[FiscalDate], -1, YEAR )
)
Copilot won’t infer your fiscal calendar; you must guide it with explicit column names and intent.
Prompt: Create a measure for sales over the last 12 months from the selected date
Typical Copilot-style output:
Sales Rolling 12M =
CALCULATE (
[Total Sales Amount],
DATESINPERIOD ( 'Date'[Date], MAX ( 'Date'[Date] ), -12, MONTH )
)
Verdict: Correct pattern for rolling windows.
DATESINPERIOD builds a date range from the max visible date, going back 12 months. CALCULATE then evaluates [Total Sales Amount] over that range.
Two things to verify manually:
'Date'[Date] is indeed the active date used for sales.Copilot often picks MAX('Date'[Date]) automatically. In most visuals this is fine, but if you’re mixing multiple date tables or using disconnected date slicers, you need to be explicit.
Prompt: Create a measure for distinct customers in the current filter context
Copilot-style output:
Distinct Customers = DISTINCTCOUNT ( Customer[CustomerID] )
Verdict: Correct, assuming:
Customer[CustomerID] is the unique keySales and Customer are correctly set (single direction or bi-directional as intended)This measure counts customers filtered by any slicers or visual context (date, segment, etc.).
If your model uses surrogate keys or composite keys, Copilot won’t know; you must point it to the right column.
Prompt: Create a measure for average order value (sales per order)
Common Copilot-style output:
Average Order Value =
DIVIDE (
SUM ( Sales[NetAmount] ),
COUNTROWS ( Sales )
)
Verdict: Often wrong for real models.
This assumes each row in Sales is a single order. In many models, each row is a line item, and COUNTROWS(Sales) counts lines, not orders.
A more robust definition uses an order ID column and DISTINCTCOUNT:
Average Order Value =
DIVIDE (
[Total Sales Amount],
DISTINCTCOUNT ( Sales[OrderID] )
)
Why Copilot struggles here:
COUNTROWS because it’s generic.When asking Copilot for measures that depend on table grain, be explicit in the prompt: mention line items vs orders and the exact key column.
Prompt: Create a measure for the percentage of sales from the Online channel
Typical Copilot-style output:
Online Sales % =
DIVIDE (
CALCULATE ( [Total Sales Amount], Sales[Channel] = "Online" ),
[Total Sales Amount]
)
Verdict: Correct pattern, but there are two subtle points.
Boolean filter expression – The filter Sales[Channel] = "Online" inside CALCULATE is evaluated as a table filter over Sales. This is valid DAX and works as intended.
Row-level security (RLS) and filter propagation – If you have RLS or complex relationships, the filter inside CALCULATE is applied after existing filters. That’s usually what you want for "share of" measures.
The measure returns the share of online sales relative to the total in the current filter context.
If you want the share within each segment or region:
The same measure works; the outer filter context (segment, region, date) applies to both numerator and denominator.
This is one of the cases where Copilot’s default is generally safe.
Your model now includes a Target table:
Target[Date]Target[Segment]Target[TargetAmount]It’s related to Date and Customer/Segment appropriately.
Prompt: Create measures for sales variance vs target and variance percentage
Common Copilot-style output for variance:
Sales vs Target =
[Total Sales Amount] - SUM ( Target[TargetAmount] )
Verdict: This can be technically correct if relationships are set, but it’s fragile:
SUM(Target[TargetAmount]) relies entirely on relationships and filter context to align target with the same date/segment filters as sales.Target is correctly related or if there are multiple targets per combination.A more explicit pattern uses a base measure for target:
Target Amount = SUM ( Target[TargetAmount] )
Sales Variance = [Total Sales Amount] - [Target Amount]
Sales Variance % =
DIVIDE ( [Sales Variance], [Target Amount] )
This is still filter-context driven, but separating the base target measure makes it easier to test and debug.
Where Copilot often fails:
SAMEPERIODLASTYEAR) with target logic incorrectly.CALCULATE with filters on the Target table that don’t match your relationship design.For anything that combines:
Copilot can suggest starting points, but you must control the filter context explicitly.
Across these measures, a pattern emerges:
What Copilot did well
SUM, DISTINCTCOUNT) on obvious numeric and key columnsDIVIDETOTALYTD, SAMEPERIODLASTYEAR, DATESINPERIOD)CALCULATE and a single filter conditionWhere Copilot struggled or became risky
Copilot currently has no understanding of your business semantics beyond what’s implicitly visible in column names and relationships. It doesn’t validate the grain or cardinality of tables and cannot see whether a measure aligns with how the business actually thinks about the metric.
For a team under pressure to deliver, here’s a pattern that works:
Use Copilot for scaffolding, not final DAX
Be explicit in prompts
Standardize on base measures
Test measures in focused visuals
Avoid Copilot for complex time-intelligence + target logic
Copilot is fast at writing syntactically valid DAX. It’s not yet good at encoding the implicit rules your team uses to interpret metrics.
Treat Copilot as a junior analyst who can type DAX quickly but doesn’t understand your business model. Let it generate the first draft of simple measures, but always review:
If those two checks become standard in your team’s review process, Copilot can genuinely save time without quietly corrupting your numbers.
This article reflects how teams are starting to use Copilot as a fast DAX scaffold while keeping human control over model grain, filter context, and business logic, especially in shared Power BI datasets under delivery pressure.
Professionals who want to apply these patterns to their own data can explore Excelgoodies' Power BI Reporting programme - taught live by instructors, with certification awarded once a real project is running at work.
Insights compiled through ongoing industry research and discussions within the Excelgoodies Analytics Community.
Power BI
New
Next Batches Now Live
Power BI
SQL
Power Apps
Power Automate
Microsoft Fabrics
Azure Data Engineering