@luquimbo/bi-superpowers 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +8 -0
- package/.mcp.json +25 -0
- package/AGENTS.md +244 -0
- package/CHANGELOG.md +265 -0
- package/LICENSE +21 -0
- package/README.md +211 -0
- package/bin/build-plugin.js +30 -0
- package/bin/cli.js +1064 -0
- package/bin/commands/add.js +533 -0
- package/bin/commands/add.test.js +77 -0
- package/bin/commands/build-desktop.js +166 -0
- package/bin/commands/changelog.js +443 -0
- package/bin/commands/diff.js +325 -0
- package/bin/commands/lint.js +419 -0
- package/bin/commands/lint.test.js +103 -0
- package/bin/commands/mcp-setup.js +246 -0
- package/bin/commands/pull.js +287 -0
- package/bin/commands/pull.test.js +36 -0
- package/bin/commands/push.js +231 -0
- package/bin/commands/push.test.js +14 -0
- package/bin/commands/search.js +344 -0
- package/bin/commands/search.test.js +115 -0
- package/bin/commands/setup.js +545 -0
- package/bin/commands/setup.test.js +46 -0
- package/bin/commands/sync-profile.js +405 -0
- package/bin/commands/sync-profile.test.js +14 -0
- package/bin/commands/sync-source.js +418 -0
- package/bin/commands/sync-source.test.js +14 -0
- package/bin/commands/watch.js +206 -0
- package/bin/lib/generators/claude-plugin.js +266 -0
- package/bin/lib/generators/claude-plugin.test.js +110 -0
- package/bin/lib/generators/index.js +116 -0
- package/bin/lib/generators/shared.js +282 -0
- package/bin/lib/licensing/index.js +35 -0
- package/bin/lib/licensing/storage.js +364 -0
- package/bin/lib/licensing/storage.test.js +55 -0
- package/bin/lib/licensing/validator.js +213 -0
- package/bin/lib/licensing/validator.test.js +137 -0
- package/bin/lib/microsoft-mcp.js +176 -0
- package/bin/lib/microsoft-mcp.test.js +106 -0
- package/bin/lib/skills.js +84 -0
- package/bin/mcp/powerbi-modeling-launcher.js +38 -0
- package/bin/postinstall.js +44 -0
- package/bin/utils/errors.js +159 -0
- package/bin/utils/git.js +298 -0
- package/bin/utils/logger.js +142 -0
- package/bin/utils/mcp-detect.js +274 -0
- package/bin/utils/mcp-detect.test.js +105 -0
- package/bin/utils/pbix.js +305 -0
- package/bin/utils/pbix.test.js +37 -0
- package/bin/utils/profiles.js +312 -0
- package/bin/utils/projects.js +168 -0
- package/bin/utils/readline.js +206 -0
- package/bin/utils/readline.test.js +47 -0
- package/bin/utils/tui.js +314 -0
- package/bin/utils/tui.test.js +127 -0
- package/commands/contributions.md +265 -0
- package/commands/data-model-design.md +468 -0
- package/commands/dax-doctor.md +248 -0
- package/commands/fabric-scripts.md +452 -0
- package/commands/migration-assistant.md +290 -0
- package/commands/model-documenter.md +242 -0
- package/commands/pbi-connect.md +239 -0
- package/commands/project-kickoff.md +905 -0
- package/commands/report-layout.md +296 -0
- package/commands/rls-design.md +533 -0
- package/commands/theme-tweaker.md +624 -0
- package/config.example.json +23 -0
- package/config.json +23 -0
- package/desktop-extension/manifest.json +37 -0
- package/desktop-extension/package.json +10 -0
- package/desktop-extension/server.js +95 -0
- package/docs/openrouter-free-models.md +92 -0
- package/library/examples/README.md +151 -0
- package/library/examples/finance-reporting/README.md +351 -0
- package/library/examples/finance-reporting/data-model.md +267 -0
- package/library/examples/finance-reporting/measures.dax +557 -0
- package/library/examples/hr-analytics/README.md +371 -0
- package/library/examples/hr-analytics/data-model.md +315 -0
- package/library/examples/hr-analytics/measures.dax +460 -0
- package/library/examples/marketing-analytics/README.md +37 -0
- package/library/examples/marketing-analytics/data-model.md +62 -0
- package/library/examples/marketing-analytics/measures.dax +110 -0
- package/library/examples/retail-analytics/README.md +439 -0
- package/library/examples/retail-analytics/data-model.md +288 -0
- package/library/examples/retail-analytics/measures.dax +481 -0
- package/library/examples/supply-chain/README.md +37 -0
- package/library/examples/supply-chain/data-model.md +69 -0
- package/library/examples/supply-chain/measures.dax +77 -0
- package/library/examples/udf-library/README.md +228 -0
- package/library/examples/udf-library/functions.dax +571 -0
- package/library/snippets/dax/README.md +292 -0
- package/library/snippets/dax/business-domains.md +576 -0
- package/library/snippets/dax/calculate-patterns.md +276 -0
- package/library/snippets/dax/calculation-groups.md +489 -0
- package/library/snippets/dax/error-handling.md +495 -0
- package/library/snippets/dax/iterators-and-aggregations.md +474 -0
- package/library/snippets/dax/kpis-and-metrics.md +293 -0
- package/library/snippets/dax/rankings-and-topn.md +235 -0
- package/library/snippets/dax/security-patterns.md +413 -0
- package/library/snippets/dax/text-and-formatting.md +316 -0
- package/library/snippets/dax/time-intelligence.md +196 -0
- package/library/snippets/dax/user-defined-functions.md +477 -0
- package/library/snippets/dax/virtual-tables.md +546 -0
- package/library/snippets/excel-formulas/README.md +84 -0
- package/library/snippets/excel-formulas/aggregations.md +330 -0
- package/library/snippets/excel-formulas/dates-and-times.md +361 -0
- package/library/snippets/excel-formulas/dynamic-arrays.md +314 -0
- package/library/snippets/excel-formulas/lookups.md +169 -0
- package/library/snippets/excel-formulas/text-functions.md +363 -0
- package/library/snippets/governance/naming-conventions.md +97 -0
- package/library/snippets/governance/review-checklists.md +107 -0
- package/library/snippets/power-query/README.md +389 -0
- package/library/snippets/power-query/api-integration.md +707 -0
- package/library/snippets/power-query/connections.md +434 -0
- package/library/snippets/power-query/data-cleaning.md +298 -0
- package/library/snippets/power-query/error-handling.md +526 -0
- package/library/snippets/power-query/parameters.md +350 -0
- package/library/snippets/power-query/performance.md +506 -0
- package/library/snippets/power-query/transformations.md +330 -0
- package/library/snippets/report-design/accessibility.md +78 -0
- package/library/snippets/report-design/chart-selection.md +54 -0
- package/library/snippets/report-design/layout-patterns.md +87 -0
- package/library/templates/data-models/README.md +93 -0
- package/library/templates/data-models/finance-model.md +627 -0
- package/library/templates/data-models/retail-star-schema.md +473 -0
- package/library/templates/excel/README.md +83 -0
- package/library/templates/excel/budget-tracker.md +432 -0
- package/library/templates/excel/data-entry-form.md +533 -0
- package/library/templates/power-bi/README.md +72 -0
- package/library/templates/power-bi/finance-report.md +449 -0
- package/library/templates/power-bi/kpi-scorecard.md +461 -0
- package/library/templates/power-bi/sales-dashboard.md +281 -0
- package/library/themes/excel/README.md +436 -0
- package/library/themes/power-bi/README.md +271 -0
- package/library/themes/power-bi/accessible.json +307 -0
- package/library/themes/power-bi/bi-superpowers-default.json +858 -0
- package/library/themes/power-bi/corporate-blue.json +291 -0
- package/library/themes/power-bi/dark-mode.json +291 -0
- package/library/themes/power-bi/minimal.json +292 -0
- package/library/themes/power-bi/print-friendly.json +309 -0
- package/package.json +93 -0
- package/skills/contributions/SKILL.md +267 -0
- package/skills/data-model-design/SKILL.md +470 -0
- package/skills/data-modeling/SKILL.md +254 -0
- package/skills/data-quality/SKILL.md +664 -0
- package/skills/dax/SKILL.md +708 -0
- package/skills/dax-doctor/SKILL.md +250 -0
- package/skills/dax-udf/SKILL.md +489 -0
- package/skills/deployment/SKILL.md +320 -0
- package/skills/excel-formulas/SKILL.md +463 -0
- package/skills/fabric-scripts/SKILL.md +454 -0
- package/skills/fast-standard/SKILL.md +509 -0
- package/skills/governance/SKILL.md +205 -0
- package/skills/migration-assistant/SKILL.md +292 -0
- package/skills/model-documenter/SKILL.md +244 -0
- package/skills/pbi-connect/SKILL.md +241 -0
- package/skills/power-query/SKILL.md +406 -0
- package/skills/project-kickoff/SKILL.md +907 -0
- package/skills/query-performance/SKILL.md +480 -0
- package/skills/report-design/SKILL.md +207 -0
- package/skills/report-layout/SKILL.md +298 -0
- package/skills/rls-design/SKILL.md +535 -0
- package/skills/semantic-model/SKILL.md +237 -0
- package/skills/testing-validation/SKILL.md +643 -0
- package/skills/theme-tweaker/SKILL.md +626 -0
- package/src/content/base.md +237 -0
- package/src/content/mcp-requirements.json +69 -0
- package/src/content/routing.md +203 -0
- package/src/content/skills/contributions.md +259 -0
- package/src/content/skills/data-model-design.md +462 -0
- package/src/content/skills/data-modeling.md +246 -0
- package/src/content/skills/data-quality.md +656 -0
- package/src/content/skills/dax-doctor.md +242 -0
- package/src/content/skills/dax-udf.md +481 -0
- package/src/content/skills/dax.md +700 -0
- package/src/content/skills/deployment.md +312 -0
- package/src/content/skills/excel-formulas.md +455 -0
- package/src/content/skills/fabric-scripts.md +446 -0
- package/src/content/skills/fast-standard.md +501 -0
- package/src/content/skills/governance.md +197 -0
- package/src/content/skills/migration-assistant.md +284 -0
- package/src/content/skills/model-documenter.md +236 -0
- package/src/content/skills/pbi-connect.md +233 -0
- package/src/content/skills/power-query.md +398 -0
- package/src/content/skills/project-kickoff.md +899 -0
- package/src/content/skills/query-performance.md +472 -0
- package/src/content/skills/report-design.md +199 -0
- package/src/content/skills/report-layout.md +290 -0
- package/src/content/skills/rls-design.md +527 -0
- package/src/content/skills/semantic-model.md +229 -0
- package/src/content/skills/testing-validation.md +635 -0
- package/src/content/skills/theme-tweaker.md +618 -0
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
# Retail Analytics - Complete Example
|
|
2
|
+
|
|
3
|
+
A complete, end-to-end example demonstrating BI Agent Superpowers patterns for a retail analytics solution.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
This example shows how to build a professional retail analytics solution using:
|
|
10
|
+
|
|
11
|
+
- **Star schema data model** with fact and dimension tables
|
|
12
|
+
- **DAX measures** for KPIs, time intelligence, and rankings
|
|
13
|
+
- **Power Query** patterns for data transformation
|
|
14
|
+
- **Power BI theme** for consistent styling
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Business Requirements
|
|
19
|
+
|
|
20
|
+
### Stakeholders
|
|
21
|
+
- Store managers: Daily sales performance
|
|
22
|
+
- Regional directors: Cross-store comparisons
|
|
23
|
+
- Finance team: Revenue and margin analysis
|
|
24
|
+
- Operations: Inventory and category insights
|
|
25
|
+
|
|
26
|
+
### Key Questions
|
|
27
|
+
1. What are our sales trends over time?
|
|
28
|
+
2. Which products and categories drive revenue?
|
|
29
|
+
3. How do stores compare in performance?
|
|
30
|
+
4. What's our margin by product category?
|
|
31
|
+
5. Who are our top customers?
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Data Model
|
|
36
|
+
|
|
37
|
+
### Star Schema Design
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
┌─────────────────┐
|
|
41
|
+
│ DimDate │
|
|
42
|
+
│─────────────────│
|
|
43
|
+
│ DateKey (PK) │
|
|
44
|
+
│ Date │
|
|
45
|
+
│ Year │
|
|
46
|
+
│ Quarter │
|
|
47
|
+
│ Month │
|
|
48
|
+
│ MonthName │
|
|
49
|
+
│ Week │
|
|
50
|
+
│ DayOfWeek │
|
|
51
|
+
│ IsWeekend │
|
|
52
|
+
└────────┬────────┘
|
|
53
|
+
│
|
|
54
|
+
┌─────────────────┐ │ ┌─────────────────┐
|
|
55
|
+
│ DimProduct │ │ │ DimCustomer │
|
|
56
|
+
│─────────────────│ │ │─────────────────│
|
|
57
|
+
│ ProductKey (PK) │ │ │ CustomerKey (PK)│
|
|
58
|
+
│ ProductID │ │ │ CustomerID │
|
|
59
|
+
│ ProductName │ │ │ CustomerName │
|
|
60
|
+
│ Category │ │ │ Email │
|
|
61
|
+
│ SubCategory │ │ │ City │
|
|
62
|
+
│ Brand │ │ │ State │
|
|
63
|
+
│ UnitCost │ │ │ Region │
|
|
64
|
+
│ UnitPrice │ │ │ JoinDate │
|
|
65
|
+
│ IsActive │ │ │ Tier │
|
|
66
|
+
└────────┬────────┘ │ └────────┬────────┘
|
|
67
|
+
│ │ │
|
|
68
|
+
│ ┌─────────────┴───────────────┐ │
|
|
69
|
+
│ │ FactSales │ │
|
|
70
|
+
│ │─────────────────────────────│ │
|
|
71
|
+
└────>│ SalesKey (PK) │<──┘
|
|
72
|
+
│ DateKey (FK) │
|
|
73
|
+
│ ProductKey (FK) │
|
|
74
|
+
│ CustomerKey (FK) │
|
|
75
|
+
│ StoreKey (FK) │
|
|
76
|
+
│ Quantity │
|
|
77
|
+
│ UnitPrice │
|
|
78
|
+
│ Discount │
|
|
79
|
+
│ Amount │
|
|
80
|
+
│ Cost │
|
|
81
|
+
└─────────────┬───────────────┘
|
|
82
|
+
│
|
|
83
|
+
┌────────┴────────┐
|
|
84
|
+
│ DimStore │
|
|
85
|
+
│─────────────────│
|
|
86
|
+
│ StoreKey (PK) │
|
|
87
|
+
│ StoreID │
|
|
88
|
+
│ StoreName │
|
|
89
|
+
│ StoreType │
|
|
90
|
+
│ City │
|
|
91
|
+
│ State │
|
|
92
|
+
│ Region │
|
|
93
|
+
│ OpenDate │
|
|
94
|
+
│ SquareFeet │
|
|
95
|
+
└─────────────────┘
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Table Details
|
|
99
|
+
|
|
100
|
+
See [data-model.md](./data-model.md) for complete column definitions and data types.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Power Query Transformations
|
|
105
|
+
|
|
106
|
+
### Source Data Preparation
|
|
107
|
+
|
|
108
|
+
```m
|
|
109
|
+
// FactSales transformation
|
|
110
|
+
let
|
|
111
|
+
Source = Sql.Database("server", "RetailDB"),
|
|
112
|
+
Sales = Source{[Schema="dbo", Item="SalesTransactions"]}[Data],
|
|
113
|
+
|
|
114
|
+
// 1. Filter to current fiscal year (folds to WHERE)
|
|
115
|
+
FilteredByDate = Table.SelectRows(Sales, each
|
|
116
|
+
[TransactionDate] >= #date(2024, 1, 1)
|
|
117
|
+
),
|
|
118
|
+
|
|
119
|
+
// 2. Select only needed columns (folds to SELECT)
|
|
120
|
+
SelectedColumns = Table.SelectColumns(FilteredByDate, {
|
|
121
|
+
"TransactionID", "TransactionDate", "ProductID",
|
|
122
|
+
"CustomerID", "StoreID", "Quantity", "UnitPrice",
|
|
123
|
+
"DiscountAmount"
|
|
124
|
+
}),
|
|
125
|
+
|
|
126
|
+
// 3. Add calculated columns
|
|
127
|
+
WithCalculations = Table.AddColumn(
|
|
128
|
+
Table.AddColumn(
|
|
129
|
+
Table.AddColumn(SelectedColumns, "Amount",
|
|
130
|
+
each [Quantity] * [UnitPrice] - [DiscountAmount], Currency.Type
|
|
131
|
+
),
|
|
132
|
+
"DateKey", each Date.ToText([TransactionDate], "yyyyMMdd"), type text
|
|
133
|
+
),
|
|
134
|
+
"SalesKey", each Text.From([TransactionID]), type text
|
|
135
|
+
),
|
|
136
|
+
|
|
137
|
+
// 4. Set final types
|
|
138
|
+
TypedTable = Table.TransformColumnTypes(WithCalculations, {
|
|
139
|
+
{"Quantity", Int64.Type},
|
|
140
|
+
{"UnitPrice", Currency.Type},
|
|
141
|
+
{"DiscountAmount", Currency.Type}
|
|
142
|
+
})
|
|
143
|
+
in
|
|
144
|
+
TypedTable
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
See [power-query.md](./power-query.md) for all table transformations.
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## DAX Measures
|
|
152
|
+
|
|
153
|
+
### Base Measures
|
|
154
|
+
|
|
155
|
+
```dax
|
|
156
|
+
// Revenue
|
|
157
|
+
Revenue =
|
|
158
|
+
SUM(FactSales[Amount])
|
|
159
|
+
|
|
160
|
+
// Cost
|
|
161
|
+
Cost =
|
|
162
|
+
SUMX(
|
|
163
|
+
FactSales,
|
|
164
|
+
FactSales[Quantity] * RELATED(DimProduct[UnitCost])
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
// Profit
|
|
168
|
+
Profit =
|
|
169
|
+
[Revenue] - [Cost]
|
|
170
|
+
|
|
171
|
+
// Profit Margin
|
|
172
|
+
Profit Margin % =
|
|
173
|
+
DIVIDE([Profit], [Revenue])
|
|
174
|
+
|
|
175
|
+
// Transaction Count
|
|
176
|
+
Transactions =
|
|
177
|
+
COUNTROWS(FactSales)
|
|
178
|
+
|
|
179
|
+
// Average Order Value
|
|
180
|
+
AOV =
|
|
181
|
+
DIVIDE([Revenue], [Transactions])
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Time Intelligence
|
|
185
|
+
|
|
186
|
+
```dax
|
|
187
|
+
// Revenue YTD
|
|
188
|
+
Revenue YTD =
|
|
189
|
+
TOTALYTD([Revenue], DimDate[Date])
|
|
190
|
+
|
|
191
|
+
// Revenue Prior Year
|
|
192
|
+
Revenue PY =
|
|
193
|
+
CALCULATE([Revenue], SAMEPERIODLASTYEAR(DimDate[Date]))
|
|
194
|
+
|
|
195
|
+
// Revenue YoY Growth %
|
|
196
|
+
Revenue YoY % =
|
|
197
|
+
VAR _Current = [Revenue]
|
|
198
|
+
VAR _PY = [Revenue PY]
|
|
199
|
+
RETURN
|
|
200
|
+
DIVIDE(_Current - _PY, _PY)
|
|
201
|
+
|
|
202
|
+
// Revenue Rolling 3 Months
|
|
203
|
+
Revenue R3M =
|
|
204
|
+
CALCULATE(
|
|
205
|
+
[Revenue],
|
|
206
|
+
DATESINPERIOD(DimDate[Date], MAX(DimDate[Date]), -3, MONTH)
|
|
207
|
+
)
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Rankings
|
|
211
|
+
|
|
212
|
+
```dax
|
|
213
|
+
// Product Rank by Revenue
|
|
214
|
+
Product Rank =
|
|
215
|
+
IF(
|
|
216
|
+
HASONEVALUE(DimProduct[ProductName]),
|
|
217
|
+
RANKX(
|
|
218
|
+
ALL(DimProduct[ProductName]),
|
|
219
|
+
[Revenue],
|
|
220
|
+
,
|
|
221
|
+
DESC,
|
|
222
|
+
DENSE
|
|
223
|
+
)
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
// Store Rank by Revenue
|
|
227
|
+
Store Rank =
|
|
228
|
+
IF(
|
|
229
|
+
HASONEVALUE(DimStore[StoreName]),
|
|
230
|
+
RANKX(
|
|
231
|
+
ALL(DimStore[StoreName]),
|
|
232
|
+
[Revenue],
|
|
233
|
+
,
|
|
234
|
+
DESC,
|
|
235
|
+
DENSE
|
|
236
|
+
)
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
// Top 10 Products Revenue
|
|
240
|
+
Revenue Top 10 Products =
|
|
241
|
+
CALCULATE(
|
|
242
|
+
[Revenue],
|
|
243
|
+
TOPN(10, ALL(DimProduct[ProductName]), [Revenue], DESC)
|
|
244
|
+
)
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### KPI Formatting
|
|
248
|
+
|
|
249
|
+
```dax
|
|
250
|
+
// Revenue with conditional color
|
|
251
|
+
Revenue Color =
|
|
252
|
+
VAR _YoY = [Revenue YoY %]
|
|
253
|
+
RETURN
|
|
254
|
+
SWITCH(
|
|
255
|
+
TRUE(),
|
|
256
|
+
_YoY >= 0.1, "#166534", // Dark green - exceeds
|
|
257
|
+
_YoY >= 0, "#22C55E", // Green - positive
|
|
258
|
+
_YoY >= -0.1, "#EAB308", // Yellow - slightly down
|
|
259
|
+
"#991B1B" // Dark red - significantly down
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
// Trend indicator
|
|
263
|
+
Revenue Trend =
|
|
264
|
+
VAR _YoY = [Revenue YoY %]
|
|
265
|
+
RETURN
|
|
266
|
+
SWITCH(
|
|
267
|
+
TRUE(),
|
|
268
|
+
_YoY >= 0.1, "▲▲",
|
|
269
|
+
_YoY >= 0, "▲",
|
|
270
|
+
_YoY >= -0.1, "▼",
|
|
271
|
+
"▼▼"
|
|
272
|
+
)
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
See [measures.dax](./measures.dax) for the complete measure library.
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
## Visualizations
|
|
280
|
+
|
|
281
|
+
### Dashboard Layout
|
|
282
|
+
|
|
283
|
+
```
|
|
284
|
+
┌──────────────────────────────────────────────────────────────────┐
|
|
285
|
+
│ RETAIL ANALYTICS [Date Range Slicer] │
|
|
286
|
+
├──────────────────────────────────────────────────────────────────┤
|
|
287
|
+
│ │
|
|
288
|
+
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐│
|
|
289
|
+
│ │ Revenue │ │ Profit │ │ Margin % │ │ AOV ││
|
|
290
|
+
│ │ $2.4M │ │ $480K │ │ 20.1% │ │ $45.20 ││
|
|
291
|
+
│ │ ▲ 12.3% │ │ ▲ 8.1% │ │ ▼ 0.3pp │ │ ▲ 5.2% ││
|
|
292
|
+
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘│
|
|
293
|
+
│ │
|
|
294
|
+
│ ┌───────────────────────────────┐ ┌───────────────────────────┐│
|
|
295
|
+
│ │ Revenue Trend │ │ Revenue by Category ││
|
|
296
|
+
│ │ [Line Chart - R12M] │ │ [Bar Chart] ││
|
|
297
|
+
│ │ │ │ ││
|
|
298
|
+
│ │ │ │ ││
|
|
299
|
+
│ └───────────────────────────────┘ └───────────────────────────┘│
|
|
300
|
+
│ │
|
|
301
|
+
│ ┌───────────────────────────────┐ ┌───────────────────────────┐│
|
|
302
|
+
│ │ Top 10 Products │ │ Store Performance ││
|
|
303
|
+
│ │ [Table with bars] │ │ [Map or Bar Chart] ││
|
|
304
|
+
│ │ │ │ ││
|
|
305
|
+
│ │ │ │ ││
|
|
306
|
+
│ └───────────────────────────────┘ └───────────────────────────┘│
|
|
307
|
+
│ │
|
|
308
|
+
└──────────────────────────────────────────────────────────────────┘
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
### Recommended Visuals
|
|
312
|
+
|
|
313
|
+
| Visual | Measures | Purpose |
|
|
314
|
+
|--------|----------|---------|
|
|
315
|
+
| Card | Revenue, Profit, Margin %, AOV | KPI summary |
|
|
316
|
+
| Line chart | Revenue by Month | Trend analysis |
|
|
317
|
+
| Clustered bar | Revenue by Category | Category comparison |
|
|
318
|
+
| Table | Top Products with Revenue, YoY % | Detailed ranking |
|
|
319
|
+
| Map | Revenue by Region/State | Geographic analysis |
|
|
320
|
+
| Slicer | Date, Category, Region | Filtering |
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
## Theme
|
|
325
|
+
|
|
326
|
+
Use the `bi-superpowers-default.json` theme for this report.
|
|
327
|
+
|
|
328
|
+
### Key Theme Settings
|
|
329
|
+
|
|
330
|
+
| Element | Setting |
|
|
331
|
+
|---------|---------|
|
|
332
|
+
| Background | #FAFAFA (page), #FFFFFF (cards) |
|
|
333
|
+
| Primary text | #171717 |
|
|
334
|
+
| Data colors | IBCS grayscale (#000000, #737373, #A3A3A3) |
|
|
335
|
+
| Good | #166534 (dark green) |
|
|
336
|
+
| Bad | #991B1B (dark red) |
|
|
337
|
+
| Border radius | 10px |
|
|
338
|
+
| Font | Segoe UI |
|
|
339
|
+
|
|
340
|
+
See [theme.json](./theme.json) for the complete theme file.
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## Implementation Checklist
|
|
345
|
+
|
|
346
|
+
### Data Model
|
|
347
|
+
- [ ] Create DimDate table with all date attributes
|
|
348
|
+
- [ ] Load DimProduct with Category/SubCategory hierarchy
|
|
349
|
+
- [ ] Load DimCustomer with Region hierarchy
|
|
350
|
+
- [ ] Load DimStore with geographic attributes
|
|
351
|
+
- [ ] Load FactSales with surrogate keys
|
|
352
|
+
- [ ] Create relationships (all 1:*)
|
|
353
|
+
- [ ] Mark DimDate as Date Table
|
|
354
|
+
- [ ] Hide foreign key columns
|
|
355
|
+
|
|
356
|
+
### Measures
|
|
357
|
+
- [ ] Create base measures (Revenue, Cost, Profit)
|
|
358
|
+
- [ ] Create time intelligence measures (YTD, PY, YoY %)
|
|
359
|
+
- [ ] Create ranking measures
|
|
360
|
+
- [ ] Create conditional formatting measures
|
|
361
|
+
- [ ] Organize measures in folders
|
|
362
|
+
|
|
363
|
+
### Visualizations
|
|
364
|
+
- [ ] Apply theme
|
|
365
|
+
- [ ] Create KPI cards row
|
|
366
|
+
- [ ] Add trend line chart
|
|
367
|
+
- [ ] Add category comparison
|
|
368
|
+
- [ ] Add Top N table
|
|
369
|
+
- [ ] Add geographic visual
|
|
370
|
+
- [ ] Configure slicers
|
|
371
|
+
- [ ] Add tooltips
|
|
372
|
+
- [ ] Test all interactions
|
|
373
|
+
|
|
374
|
+
### Polish
|
|
375
|
+
- [ ] Add report title
|
|
376
|
+
- [ ] Add last refresh date
|
|
377
|
+
- [ ] Configure mobile layout
|
|
378
|
+
- [ ] Test filter interactions
|
|
379
|
+
- [ ] Optimize performance (DAX Studio)
|
|
380
|
+
- [ ] Document assumptions
|
|
381
|
+
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
## Files in This Example
|
|
385
|
+
|
|
386
|
+
| File | Description |
|
|
387
|
+
|------|-------------|
|
|
388
|
+
| [README.md](./README.md) | This overview |
|
|
389
|
+
| [data-model.md](./data-model.md) | Complete table definitions |
|
|
390
|
+
| [power-query.md](./power-query.md) | All M code transformations |
|
|
391
|
+
| [measures.dax](./measures.dax) | Complete DAX measure library |
|
|
392
|
+
| [theme.json](./theme.json) | Power BI theme file |
|
|
393
|
+
|
|
394
|
+
---
|
|
395
|
+
|
|
396
|
+
## Extending This Example
|
|
397
|
+
|
|
398
|
+
### Add Customer Segmentation
|
|
399
|
+
|
|
400
|
+
```dax
|
|
401
|
+
Customer Segment =
|
|
402
|
+
VAR _CustomerRevenue = [Revenue]
|
|
403
|
+
VAR _AvgCustomerRevenue =
|
|
404
|
+
CALCULATE(
|
|
405
|
+
AVERAGEX(VALUES(DimCustomer[CustomerKey]), [Revenue]),
|
|
406
|
+
ALL(DimCustomer)
|
|
407
|
+
)
|
|
408
|
+
RETURN
|
|
409
|
+
SWITCH(
|
|
410
|
+
TRUE(),
|
|
411
|
+
_CustomerRevenue >= _AvgCustomerRevenue * 2, "VIP",
|
|
412
|
+
_CustomerRevenue >= _AvgCustomerRevenue, "Regular",
|
|
413
|
+
"Occasional"
|
|
414
|
+
)
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
### Add Inventory Analysis
|
|
418
|
+
|
|
419
|
+
Create a FactInventory table and add measures like:
|
|
420
|
+
|
|
421
|
+
```dax
|
|
422
|
+
Stock Days =
|
|
423
|
+
DIVIDE([Current Stock], [Daily Sales Rate])
|
|
424
|
+
|
|
425
|
+
Reorder Alert =
|
|
426
|
+
IF([Stock Days] < 14, "Reorder", "OK")
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
### Add Forecast Comparison
|
|
430
|
+
|
|
431
|
+
If you have budget/forecast data:
|
|
432
|
+
|
|
433
|
+
```dax
|
|
434
|
+
Revenue vs Budget % =
|
|
435
|
+
DIVIDE([Revenue] - [Budget], [Budget])
|
|
436
|
+
|
|
437
|
+
Budget Variance =
|
|
438
|
+
[Revenue] - [Budget]
|
|
439
|
+
```
|