
Powerbi Modeling
Name tables, columns, and DAX measures consistently and choose explicit vs implicit measures for solo-friendly Power BI semantic models.
Overview
Power BI Modeling is an agent skill most often used in Grow (also Build backend, Operate iterate) that defines DAX measure and Power BI naming conventions for semantic models.
Install
npx skills add https://github.com/github/awesome-copilot --skill powerbi-modelingWhat is this skill?
- Title-case human-readable names with dimension/fact/bridge and _Measures table conventions
- Column patterns for keys, dates, amounts, and Is/Has flags
- Measure naming for aggregations, ratios, time intelligence, and vs-baseline comparisons
- Guidance on when to create explicit DAX measures versus implicit aggregations
- Structured tables for table, column, and measure naming reference
- explicit vs implicit measure decision checklist categories in naming tables
Adoption & trust: 9.1k installs on skills.sh; 34.6k GitHub stars; 3/3 security scanners passed (skills.sh audits).
What problem does it solve?
Your Power BI model uses opaque abbreviations, inconsistent measure names, and implicit aggregations that confuse you and break time-intelligence patterns.
Who is it for?
Solo builders maintaining their own Power BI datasets who need durable naming and measure discipline.
Skip if: Teams on Tableau/Looker only, raw ETL pipeline authoring with no semantic model, or one-off charts with no reusable measures.
When should I use this skill?
User asks about Power BI naming, DAX measures, semantic model conventions, KPI tables, or time-intelligence measure labels.
What do I get? / Deliverables
You get a consistent star-friendly naming scheme and explicit measures suited for KPIs, YTD/PY logic, and comparisons users actually filter.
- Table and column naming scheme
- Measure naming patterns for KPIs and time intelligence
- Explicit measure recommendations for key metrics
Recommended Skills
Journey fit
Spans multiple journey phases - primary shelf plus alternate fits below.
Grow/analytics is the primary shelf because the skill optimizes models people query for decisions—not initial app scaffolding. Analytics subphase fits semantic-layer conventions, KPI tables, and DAX measure patterns that underpin dashboards and reporting.
Where it fits
Name prototype sales and date tables before pitching metrics on a landing demo.
Add _Measures with Total Sales and YTD Sales following ratio and time-intelligence labels.
Refactor abbreviated columns to CustomerKey and IsActive after support confusion.
Align public-facing metric definitions with measure names shared in investor updates.
How it compares
Semantic-layer naming and DAX conventions—not a full Power BI deployment or refresh automation skill.
Common Questions / FAQ
Who is powerbi-modeling for?
Indie founders and solo analysts modeling sales, orders, or operations data in Power BI who want reports that stay understandable without a BI team.
When should I use powerbi-modeling?
Use it when defining a new star schema in Grow analytics, cleaning measure names before launch dashboards, or iterating Operate reports after users ask confusing questions about metrics.
Is powerbi-modeling safe to install?
The skill is convention documentation; review the Security Audits panel on this Prism page and avoid pasting production secrets into chat while remodeling datasets.
SKILL.md
READMESKILL.md - Powerbi Modeling
# DAX Measures and Naming Conventions ## Naming Conventions ### General Rules - Use human-readable names (spaces allowed) - Be descriptive: `Total Sales Amount` not `TSA` - Avoid abbreviations unless universally understood - Use consistent capitalization (Title Case recommended) - Avoid special characters except spaces ### Table Naming | Type | Convention | Example | |------|------------|---------| | Dimension | Singular noun | Customer, Product, Date | | Fact | Business process | Sales, Orders, Inventory | | Bridge | Combined names | CustomerAccount, ProductCategory | | Measure Table | Underscore prefix | _Measures, _KPIs | ### Column Naming | Type | Convention | Example | |------|------------|---------| | Keys | Suffix with "Key" or "ID" | CustomerKey, ProductID | | Dates | Suffix with "Date" | OrderDate, ShipDate | | Amounts | Descriptive with unit hint | SalesAmount, QuantitySold | | Flags | Prefix with "Is" or "Has" | IsActive, HasDiscount | ### Measure Naming | Type | Convention | Example | |------|------------|---------| | Aggregations | Verb + Noun | Total Sales, Count of Orders | | Ratios | X per Y or X Rate | Sales per Customer, Conversion Rate | | Time Intelligence | Period + Metric | YTD Sales, PY Total Sales | | Comparisons | Metric + vs + Baseline | Sales vs Budget, Growth vs PY | ## Explicit vs Implicit Measures ### Always Create Explicit Measures For: 1. Key business metrics users will query 2. Complex calculations with filter manipulation 3. Measures used in MDX (Excel PivotTables) 4. Controlled aggregation (prevent sum of averages) ### Implicit Measures (Column Aggregations) - Acceptable for simple exploration - Set correct SummarizeBy property: - Amounts: Sum - Keys/IDs: None (Do Not Summarize) - Rates/Prices: None or Average ## Measure Patterns ### Basic Aggregations ```dax Total Sales = SUM(Sales[SalesAmount]) Order Count = COUNTROWS(Sales) Average Order Value = DIVIDE([Total Sales], [Order Count]) Distinct Customers = DISTINCTCOUNT(Sales[CustomerKey]) ``` ### Time Intelligence (Requires Date Table) ```dax YTD Sales = TOTALYTD([Total Sales], 'Date'[Date]) MTD Sales = TOTALMTD([Total Sales], 'Date'[Date]) PY Sales = CALCULATE([Total Sales], SAMEPERIODLASTYEAR('Date'[Date])) YoY Growth = DIVIDE([Total Sales] - [PY Sales], [PY Sales]) ``` ### Percentage Calculations ```dax Sales % of Total = DIVIDE( [Total Sales], CALCULATE([Total Sales], REMOVEFILTERS(Product)) ) Margin % = DIVIDE([Gross Profit], [Total Sales]) ``` ### Running Totals ```dax Running Total = CALCULATE( [Total Sales], FILTER( ALL('Date'), 'Date'[Date] <= MAX('Date'[Date]) ) ) ``` ## Column References ### Best Practice: Always Qualify Column Names ```dax // GOOD - Fully qualified Sales Amount = SUM(Sales[SalesAmount]) // BAD - Unqualified (can cause ambiguity) Sales Amount = SUM([SalesAmount]) ``` ### Measure References: Never Qualify ```dax // GOOD - Unqualified measure YTD Sales = TOTALYTD([Total Sales], 'Date'[Date]) // BAD - Qualified measure (breaks if home table changes) YTD Sales = TOTALYTD(Sales[Total Sales], 'Date'[Date]) ``` ## Documentation ### Measure Descriptions Always add descriptions explaining: - What the measure calculates - Business context/usage - Any important assumptions ``` measure_operations( operation: "Update", definitions: [{ name: "Total Sales", tableName: "Sales", description: "Sum of all completed sales transactions. Excludes returns and cancelled orders." }] ) ``` ### Format Strings | Data Type | Format String | Example Output | |-----------|---------------|----------------| | Currency | $#,##0.00 | $1,234.56 | | Percentage | 0.0% | 12.3% | | Whole Number | #,##0 | 1,234 | | Decimal | #,##0.00 | 1,234.56 | ## Display Folders Organize measures into logical groups: ``` measure_operations( operation: "Update", definitions: [{ name: "YTD Sales", tableName: "_Measures", displayFolder: "Time Intelligence\\Year" }] ) `