@luquimbo/bi-superpowers 3.1.1 → 4.1.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/marketplace.json +5 -3
- package/.claude-plugin/plugin.json +28 -2
- package/.claude-plugin/skill-manifest.json +22 -6
- package/.plugin/plugin.json +1 -1
- package/AGENTS.md +52 -36
- package/CHANGELOG.md +295 -0
- package/README.md +75 -26
- package/bin/build-plugin.js +17 -10
- package/bin/cli.js +278 -322
- package/bin/commands/build-desktop.js +35 -16
- package/bin/commands/diff.js +31 -13
- package/bin/commands/install.js +93 -72
- package/bin/commands/lint.js +40 -26
- package/bin/commands/mcp-setup.js +3 -10
- package/bin/commands/update-check.js +389 -0
- package/bin/lib/agents.js +19 -0
- package/bin/lib/generators/claude-plugin.js +144 -6
- package/bin/lib/generators/shared.js +29 -33
- package/bin/lib/mcp-config.js +191 -16
- package/bin/lib/skills.js +115 -27
- package/bin/postinstall.js +4 -2
- package/bin/utils/mcp-detect.js +2 -2
- package/commands/bi-start.md +218 -0
- package/commands/pbi-connect.md +43 -65
- package/commands/project-kickoff.md +393 -673
- package/commands/report-design.md +403 -0
- package/desktop-extension/manifest.json +5 -12
- package/desktop-extension/server.js +34 -25
- package/package.json +6 -10
- package/skills/bi-start/SKILL.md +220 -0
- package/skills/bi-start/scripts/update-check.js +389 -0
- package/skills/pbi-connect/SKILL.md +45 -67
- package/skills/pbi-connect/scripts/update-check.js +389 -0
- package/skills/project-kickoff/SKILL.md +395 -675
- package/skills/project-kickoff/scripts/update-check.js +389 -0
- package/skills/report-design/SKILL.md +405 -0
- package/skills/report-design/references/cli-commands.md +184 -0
- package/skills/report-design/references/cli-setup.md +101 -0
- package/skills/report-design/references/close-write-open-pattern.md +80 -0
- package/skills/report-design/references/layouts/finance.md +65 -0
- package/skills/report-design/references/layouts/generic.md +46 -0
- package/skills/report-design/references/layouts/hr.md +48 -0
- package/skills/report-design/references/layouts/marketing.md +45 -0
- package/skills/report-design/references/layouts/operations.md +44 -0
- package/skills/report-design/references/layouts/sales.md +50 -0
- package/skills/report-design/references/native-visuals.md +341 -0
- package/skills/report-design/references/pbi-desktop-installation.md +87 -0
- package/skills/report-design/references/pbir-preview-activation.md +40 -0
- package/skills/report-design/references/slicer.md +89 -0
- package/skills/report-design/references/textbox.md +101 -0
- package/skills/report-design/references/themes/BISuperpowers.json +915 -0
- package/skills/report-design/references/troubleshooting.md +135 -0
- package/skills/report-design/references/visual-types.md +78 -0
- package/skills/report-design/scripts/apply-theme.js +243 -0
- package/skills/report-design/scripts/create-visual.js +878 -0
- package/skills/report-design/scripts/ensure-pbi-cli.sh +41 -0
- package/skills/report-design/scripts/update-check.js +389 -0
- package/skills/report-design/scripts/validate-pbir.js +322 -0
- package/src/content/base.md +12 -68
- package/src/content/mcp-requirements.json +0 -25
- package/src/content/routing.md +19 -74
- package/src/content/skills/bi-start.md +191 -0
- package/src/content/skills/pbi-connect.md +22 -65
- package/src/content/skills/project-kickoff.md +372 -673
- package/src/content/skills/report-design/SKILL.md +376 -0
- package/src/content/skills/report-design/references/cli-commands.md +184 -0
- package/src/content/skills/report-design/references/cli-setup.md +101 -0
- package/src/content/skills/report-design/references/close-write-open-pattern.md +80 -0
- package/src/content/skills/report-design/references/layouts/finance.md +65 -0
- package/src/content/skills/report-design/references/layouts/generic.md +46 -0
- package/src/content/skills/report-design/references/layouts/hr.md +48 -0
- package/src/content/skills/report-design/references/layouts/marketing.md +45 -0
- package/src/content/skills/report-design/references/layouts/operations.md +44 -0
- package/src/content/skills/report-design/references/layouts/sales.md +50 -0
- package/src/content/skills/report-design/references/native-visuals.md +341 -0
- package/src/content/skills/report-design/references/pbi-desktop-installation.md +87 -0
- package/src/content/skills/report-design/references/pbir-preview-activation.md +40 -0
- package/src/content/skills/report-design/references/slicer.md +89 -0
- package/src/content/skills/report-design/references/textbox.md +101 -0
- package/src/content/skills/report-design/references/themes/BISuperpowers.json +915 -0
- package/src/content/skills/report-design/references/troubleshooting.md +135 -0
- package/src/content/skills/report-design/references/visual-types.md +78 -0
- package/src/content/skills/report-design/scripts/apply-theme.js +243 -0
- package/src/content/skills/report-design/scripts/create-visual.js +878 -0
- package/src/content/skills/report-design/scripts/ensure-pbi-cli.sh +41 -0
- package/src/content/skills/report-design/scripts/validate-pbir.js +322 -0
- package/bin/commands/add.js +0 -533
- package/bin/commands/add.test.js +0 -77
- package/bin/commands/changelog.js +0 -443
- package/bin/commands/install.test.js +0 -289
- package/bin/commands/lint.test.js +0 -103
- package/bin/commands/pull.js +0 -287
- package/bin/commands/pull.test.js +0 -36
- package/bin/commands/push.js +0 -231
- package/bin/commands/push.test.js +0 -14
- package/bin/commands/search.js +0 -344
- package/bin/commands/search.test.js +0 -115
- package/bin/commands/setup.js +0 -545
- package/bin/commands/setup.test.js +0 -46
- package/bin/commands/sync-profile.js +0 -405
- package/bin/commands/sync-profile.test.js +0 -14
- package/bin/commands/sync-source.js +0 -418
- package/bin/commands/sync-source.test.js +0 -14
- package/bin/lib/generators/claude-plugin.test.js +0 -111
- package/bin/lib/mcp-config.test.js +0 -310
- package/bin/lib/microsoft-mcp.test.js +0 -115
- package/bin/utils/errors.js +0 -159
- package/bin/utils/git.js +0 -298
- package/bin/utils/logger.js +0 -142
- package/bin/utils/mcp-detect.test.js +0 -81
- package/bin/utils/pbix.js +0 -305
- package/bin/utils/pbix.test.js +0 -37
- package/bin/utils/profiles.js +0 -312
- package/bin/utils/projects.js +0 -169
- package/bin/utils/readline.js +0 -206
- package/bin/utils/readline.test.js +0 -47
- package/bin/utils/tui.test.js +0 -127
- package/docs/openrouter-free-models.md +0 -92
- package/library/examples/README.md +0 -151
- package/library/examples/finance-reporting/README.md +0 -351
- package/library/examples/finance-reporting/data-model.md +0 -267
- package/library/examples/finance-reporting/measures.dax +0 -557
- package/library/examples/hr-analytics/README.md +0 -371
- package/library/examples/hr-analytics/data-model.md +0 -315
- package/library/examples/hr-analytics/measures.dax +0 -460
- package/library/examples/marketing-analytics/README.md +0 -37
- package/library/examples/marketing-analytics/data-model.md +0 -62
- package/library/examples/marketing-analytics/measures.dax +0 -110
- package/library/examples/retail-analytics/README.md +0 -439
- package/library/examples/retail-analytics/data-model.md +0 -288
- package/library/examples/retail-analytics/measures.dax +0 -481
- package/library/examples/supply-chain/README.md +0 -37
- package/library/examples/supply-chain/data-model.md +0 -69
- package/library/examples/supply-chain/measures.dax +0 -77
- package/library/examples/udf-library/README.md +0 -228
- package/library/examples/udf-library/functions.dax +0 -571
- package/library/snippets/dax/README.md +0 -292
- package/library/snippets/dax/business-domains.md +0 -576
- package/library/snippets/dax/calculate-patterns.md +0 -276
- package/library/snippets/dax/calculation-groups.md +0 -489
- package/library/snippets/dax/error-handling.md +0 -495
- package/library/snippets/dax/iterators-and-aggregations.md +0 -474
- package/library/snippets/dax/kpis-and-metrics.md +0 -293
- package/library/snippets/dax/rankings-and-topn.md +0 -235
- package/library/snippets/dax/security-patterns.md +0 -413
- package/library/snippets/dax/text-and-formatting.md +0 -316
- package/library/snippets/dax/time-intelligence.md +0 -196
- package/library/snippets/dax/user-defined-functions.md +0 -477
- package/library/snippets/dax/virtual-tables.md +0 -546
- package/library/snippets/excel-formulas/README.md +0 -84
- package/library/snippets/excel-formulas/aggregations.md +0 -330
- package/library/snippets/excel-formulas/dates-and-times.md +0 -361
- package/library/snippets/excel-formulas/dynamic-arrays.md +0 -314
- package/library/snippets/excel-formulas/lookups.md +0 -169
- package/library/snippets/excel-formulas/text-functions.md +0 -363
- package/library/snippets/governance/naming-conventions.md +0 -97
- package/library/snippets/governance/review-checklists.md +0 -107
- package/library/snippets/power-query/README.md +0 -389
- package/library/snippets/power-query/api-integration.md +0 -707
- package/library/snippets/power-query/connections.md +0 -434
- package/library/snippets/power-query/data-cleaning.md +0 -298
- package/library/snippets/power-query/error-handling.md +0 -526
- package/library/snippets/power-query/parameters.md +0 -350
- package/library/snippets/power-query/performance.md +0 -506
- package/library/snippets/power-query/transformations.md +0 -330
- package/library/snippets/report-design/accessibility.md +0 -78
- package/library/snippets/report-design/chart-selection.md +0 -54
- package/library/snippets/report-design/layout-patterns.md +0 -87
- package/library/templates/data-models/README.md +0 -93
- package/library/templates/data-models/finance-model.md +0 -627
- package/library/templates/data-models/retail-star-schema.md +0 -473
- package/library/templates/excel/README.md +0 -83
- package/library/templates/excel/budget-tracker.md +0 -432
- package/library/templates/excel/data-entry-form.md +0 -533
- package/library/templates/power-bi/README.md +0 -72
- package/library/templates/power-bi/finance-report.md +0 -449
- package/library/templates/power-bi/kpi-scorecard.md +0 -461
- package/library/templates/power-bi/sales-dashboard.md +0 -281
- package/library/themes/excel/README.md +0 -436
- package/library/themes/power-bi/README.md +0 -271
- package/library/themes/power-bi/accessible.json +0 -307
- package/library/themes/power-bi/bi-superpowers-default.json +0 -858
- package/library/themes/power-bi/corporate-blue.json +0 -291
- package/library/themes/power-bi/dark-mode.json +0 -291
- package/library/themes/power-bi/minimal.json +0 -292
- package/library/themes/power-bi/print-friendly.json +0 -309
|
@@ -1,293 +0,0 @@
|
|
|
1
|
-
# KPIs and Metrics DAX Patterns
|
|
2
|
-
|
|
3
|
-
Reusable DAX measures for business metrics, variance analysis, and KPI calculations.
|
|
4
|
-
|
|
5
|
-
## Variance Analysis
|
|
6
|
-
|
|
7
|
-
### Absolute Variance
|
|
8
|
-
```dax
|
|
9
|
-
Variance_Actual_vs_Budget =
|
|
10
|
-
[ActualSales] - [BudgetSales]
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
### Variance Percentage
|
|
14
|
-
```dax
|
|
15
|
-
Variance_Pct =
|
|
16
|
-
DIVIDE(
|
|
17
|
-
[ActualSales] - [BudgetSales],
|
|
18
|
-
[BudgetSales]
|
|
19
|
-
)
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
### Variance with Direction Indicator
|
|
23
|
-
```dax
|
|
24
|
-
Variance_Indicator =
|
|
25
|
-
VAR _Variance = [ActualSales] - [BudgetSales]
|
|
26
|
-
RETURN
|
|
27
|
-
SWITCH(
|
|
28
|
-
TRUE(),
|
|
29
|
-
_Variance > 0, "Above",
|
|
30
|
-
_Variance < 0, "Below",
|
|
31
|
-
"On Target"
|
|
32
|
-
)
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
### Variance Icon (for Conditional Formatting)
|
|
36
|
-
```dax
|
|
37
|
-
Variance_Icon =
|
|
38
|
-
VAR _Pct = [Variance_Pct]
|
|
39
|
-
RETURN
|
|
40
|
-
SWITCH(
|
|
41
|
-
TRUE(),
|
|
42
|
-
_Pct >= 0.05, "Up", -- 5%+ above
|
|
43
|
-
_Pct >= 0, "Flat", -- 0-5% above
|
|
44
|
-
_Pct >= -0.05, "Flat", -- 0-5% below
|
|
45
|
-
"Down" -- 5%+ below
|
|
46
|
-
)
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
## Growth Metrics
|
|
50
|
-
|
|
51
|
-
### Year-over-Year Growth
|
|
52
|
-
```dax
|
|
53
|
-
YoY_Growth =
|
|
54
|
-
VAR _Current = [TotalSales]
|
|
55
|
-
VAR _PY = [Sales_PY]
|
|
56
|
-
RETURN
|
|
57
|
-
DIVIDE(_Current - _PY, _PY)
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
### Month-over-Month Growth
|
|
61
|
-
```dax
|
|
62
|
-
MoM_Growth =
|
|
63
|
-
VAR _Current = [TotalSales]
|
|
64
|
-
VAR _PM = [Sales_PM]
|
|
65
|
-
RETURN
|
|
66
|
-
DIVIDE(_Current - _PM, _PM)
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
### Compound Annual Growth Rate (CAGR)
|
|
70
|
-
```dax
|
|
71
|
-
CAGR =
|
|
72
|
-
VAR _StartValue = CALCULATE([TotalSales], FIRSTDATE('Date'[Date]))
|
|
73
|
-
VAR _EndValue = CALCULATE([TotalSales], LASTDATE('Date'[Date]))
|
|
74
|
-
VAR _Years = DATEDIFF(MIN('Date'[Date]), MAX('Date'[Date]), YEAR)
|
|
75
|
-
RETURN
|
|
76
|
-
IF(
|
|
77
|
-
_Years > 0 && _StartValue > 0,
|
|
78
|
-
POWER(DIVIDE(_EndValue, _StartValue), DIVIDE(1, _Years)) - 1,
|
|
79
|
-
BLANK()
|
|
80
|
-
)
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
## Ratios and Margins
|
|
84
|
-
|
|
85
|
-
### Profit Margin
|
|
86
|
-
```dax
|
|
87
|
-
ProfitMargin =
|
|
88
|
-
DIVIDE(
|
|
89
|
-
[TotalProfit],
|
|
90
|
-
[TotalRevenue]
|
|
91
|
-
)
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
### Gross Margin
|
|
95
|
-
```dax
|
|
96
|
-
GrossMargin =
|
|
97
|
-
DIVIDE(
|
|
98
|
-
[TotalRevenue] - [TotalCOGS],
|
|
99
|
-
[TotalRevenue]
|
|
100
|
-
)
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
### Contribution Margin
|
|
104
|
-
```dax
|
|
105
|
-
ContributionMargin =
|
|
106
|
-
DIVIDE(
|
|
107
|
-
[TotalRevenue] - [VariableCosts],
|
|
108
|
-
[TotalRevenue]
|
|
109
|
-
)
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
### Return on Investment (ROI)
|
|
113
|
-
```dax
|
|
114
|
-
ROI =
|
|
115
|
-
DIVIDE(
|
|
116
|
-
[TotalProfit] - [Investment],
|
|
117
|
-
[Investment]
|
|
118
|
-
)
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
## Conversion and Efficiency
|
|
122
|
-
|
|
123
|
-
### Conversion Rate
|
|
124
|
-
```dax
|
|
125
|
-
ConversionRate =
|
|
126
|
-
DIVIDE(
|
|
127
|
-
[CompletedOrders],
|
|
128
|
-
[TotalVisits]
|
|
129
|
-
)
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
### Customer Acquisition Cost (CAC)
|
|
133
|
-
```dax
|
|
134
|
-
CAC =
|
|
135
|
-
DIVIDE(
|
|
136
|
-
[MarketingSpend],
|
|
137
|
-
[NewCustomers]
|
|
138
|
-
)
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
### Customer Lifetime Value (CLV)
|
|
142
|
-
```dax
|
|
143
|
-
CLV =
|
|
144
|
-
[AverageOrderValue] * [PurchaseFrequency] * [CustomerLifespan]
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
### CLV to CAC Ratio
|
|
148
|
-
```dax
|
|
149
|
-
CLV_CAC_Ratio =
|
|
150
|
-
DIVIDE([CLV], [CAC])
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
## Performance Indicators
|
|
154
|
-
|
|
155
|
-
### Target Achievement %
|
|
156
|
-
```dax
|
|
157
|
-
TargetAchievement =
|
|
158
|
-
DIVIDE([ActualSales], [TargetSales])
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
### Traffic Light Status
|
|
162
|
-
```dax
|
|
163
|
-
Status_TrafficLight =
|
|
164
|
-
VAR _Achievement = [TargetAchievement]
|
|
165
|
-
RETURN
|
|
166
|
-
SWITCH(
|
|
167
|
-
TRUE(),
|
|
168
|
-
_Achievement >= 1, "Green",
|
|
169
|
-
_Achievement >= 0.8, "Yellow",
|
|
170
|
-
"Red"
|
|
171
|
-
)
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
### Status with Numeric Code
|
|
175
|
-
```dax
|
|
176
|
-
Status_Code =
|
|
177
|
-
VAR _Achievement = [TargetAchievement]
|
|
178
|
-
RETURN
|
|
179
|
-
SWITCH(
|
|
180
|
-
TRUE(),
|
|
181
|
-
_Achievement >= 1, 3, -- Green
|
|
182
|
-
_Achievement >= 0.8, 2, -- Yellow
|
|
183
|
-
1 -- Red
|
|
184
|
-
)
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
## Average Metrics
|
|
188
|
-
|
|
189
|
-
### Average Order Value (AOV)
|
|
190
|
-
```dax
|
|
191
|
-
AOV =
|
|
192
|
-
DIVIDE(
|
|
193
|
-
[TotalRevenue],
|
|
194
|
-
[OrderCount]
|
|
195
|
-
)
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
### Average Revenue per User (ARPU)
|
|
199
|
-
```dax
|
|
200
|
-
ARPU =
|
|
201
|
-
DIVIDE(
|
|
202
|
-
[TotalRevenue],
|
|
203
|
-
[UniqueCustomers]
|
|
204
|
-
)
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
### Weighted Average
|
|
208
|
-
```dax
|
|
209
|
-
WeightedAvgPrice =
|
|
210
|
-
DIVIDE(
|
|
211
|
-
SUMX(Sales, Sales[Quantity] * Sales[UnitPrice]),
|
|
212
|
-
SUM(Sales[Quantity])
|
|
213
|
-
)
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
## Dynamic Metrics
|
|
217
|
-
|
|
218
|
-
### Selected Metric (Slicer-Driven)
|
|
219
|
-
```dax
|
|
220
|
-
SelectedMetric =
|
|
221
|
-
VAR _Selection = SELECTEDVALUE('Metrics'[MetricName], "Sales")
|
|
222
|
-
RETURN
|
|
223
|
-
SWITCH(
|
|
224
|
-
_Selection,
|
|
225
|
-
"Sales", [TotalSales],
|
|
226
|
-
"Profit", [TotalProfit],
|
|
227
|
-
"Margin", [ProfitMargin],
|
|
228
|
-
"Orders", [OrderCount],
|
|
229
|
-
[TotalSales]
|
|
230
|
-
)
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
### Dynamic Title
|
|
234
|
-
```dax
|
|
235
|
-
ChartTitle =
|
|
236
|
-
VAR _Metric = SELECTEDVALUE('Metrics'[MetricName], "Sales")
|
|
237
|
-
VAR _Period = SELECTEDVALUE('Date'[Year])
|
|
238
|
-
RETURN
|
|
239
|
-
_Metric & " Performance - " & _Period
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
## Benchmarking
|
|
243
|
-
|
|
244
|
-
### Percentile Rank
|
|
245
|
-
```dax
|
|
246
|
-
PercentileRank =
|
|
247
|
-
VAR _CurrentValue = [TotalSales]
|
|
248
|
-
VAR _AllValues =
|
|
249
|
-
ADDCOLUMNS(
|
|
250
|
-
ALL(Products),
|
|
251
|
-
"@Sales", [TotalSales]
|
|
252
|
-
)
|
|
253
|
-
VAR _CountBelow =
|
|
254
|
-
COUNTROWS(FILTER(_AllValues, [@Sales] < _CurrentValue))
|
|
255
|
-
VAR _Total = COUNTROWS(_AllValues)
|
|
256
|
-
RETURN
|
|
257
|
-
DIVIDE(_CountBelow, _Total)
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
### Distance from Average
|
|
261
|
-
```dax
|
|
262
|
-
Distance_From_Avg =
|
|
263
|
-
VAR _Current = [TotalSales]
|
|
264
|
-
VAR _Avg = AVERAGEX(ALL(Products), [TotalSales])
|
|
265
|
-
RETURN
|
|
266
|
-
_Current - _Avg
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
### Z-Score
|
|
270
|
-
```dax
|
|
271
|
-
ZScore =
|
|
272
|
-
VAR _Current = [TotalSales]
|
|
273
|
-
VAR _AllValues =
|
|
274
|
-
ADDCOLUMNS(ALL(Products), "@Sales", [TotalSales])
|
|
275
|
-
VAR _Avg = AVERAGEX(_AllValues, [@Sales])
|
|
276
|
-
VAR _StdDev =
|
|
277
|
-
SQRT(
|
|
278
|
-
AVERAGEX(
|
|
279
|
-
_AllValues,
|
|
280
|
-
POWER([@Sales] - _Avg, 2)
|
|
281
|
-
)
|
|
282
|
-
)
|
|
283
|
-
RETURN
|
|
284
|
-
DIVIDE(_Current - _Avg, _StdDev)
|
|
285
|
-
```
|
|
286
|
-
|
|
287
|
-
## Usage Notes
|
|
288
|
-
|
|
289
|
-
- Always use DIVIDE() for safe division
|
|
290
|
-
- Consider BLANK() handling for incomplete data periods
|
|
291
|
-
- Use variables for complex calculations (readability + performance)
|
|
292
|
-
- Test metrics with various filter contexts
|
|
293
|
-
- Document expected ranges for KPIs
|
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
# Rankings and Top N DAX Patterns
|
|
2
|
-
|
|
3
|
-
Reusable DAX measures for ranking and top/bottom analysis.
|
|
4
|
-
|
|
5
|
-
## Basic Rankings
|
|
6
|
-
|
|
7
|
-
### Simple Rank (Descending)
|
|
8
|
-
```dax
|
|
9
|
-
ProductRank =
|
|
10
|
-
RANKX(
|
|
11
|
-
ALL(Products[ProductName]),
|
|
12
|
-
[TotalSales],
|
|
13
|
-
,
|
|
14
|
-
DESC,
|
|
15
|
-
DENSE
|
|
16
|
-
)
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
### Rank within Category
|
|
20
|
-
```dax
|
|
21
|
-
ProductRank_InCategory =
|
|
22
|
-
RANKX(
|
|
23
|
-
ALLEXCEPT(Products, Products[Category]),
|
|
24
|
-
[TotalSales],
|
|
25
|
-
,
|
|
26
|
-
DESC,
|
|
27
|
-
DENSE
|
|
28
|
-
)
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
### Dynamic Rank (Respects Filters)
|
|
32
|
-
```dax
|
|
33
|
-
ProductRank_Dynamic =
|
|
34
|
-
IF(
|
|
35
|
-
HASONEVALUE(Products[ProductName]),
|
|
36
|
-
RANKX(
|
|
37
|
-
ALLSELECTED(Products[ProductName]),
|
|
38
|
-
[TotalSales],
|
|
39
|
-
,
|
|
40
|
-
DESC,
|
|
41
|
-
DENSE
|
|
42
|
-
)
|
|
43
|
-
)
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
## Top N Analysis
|
|
47
|
-
|
|
48
|
-
### Top 5 Products Sales
|
|
49
|
-
```dax
|
|
50
|
-
Top5_Products_Sales =
|
|
51
|
-
CALCULATE(
|
|
52
|
-
[TotalSales],
|
|
53
|
-
TOPN(
|
|
54
|
-
5,
|
|
55
|
-
ALL(Products[ProductName]),
|
|
56
|
-
[TotalSales],
|
|
57
|
-
DESC
|
|
58
|
-
)
|
|
59
|
-
)
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
### Top N with Parameter
|
|
63
|
-
```dax
|
|
64
|
-
TopN_Sales =
|
|
65
|
-
VAR _N = SELECTEDVALUE('Parameters'[TopN], 10)
|
|
66
|
-
RETURN
|
|
67
|
-
CALCULATE(
|
|
68
|
-
[TotalSales],
|
|
69
|
-
TOPN(
|
|
70
|
-
_N,
|
|
71
|
-
ALL(Products[ProductName]),
|
|
72
|
-
[TotalSales],
|
|
73
|
-
DESC
|
|
74
|
-
)
|
|
75
|
-
)
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
### Top N % of Total
|
|
79
|
-
```dax
|
|
80
|
-
TopN_Pct_of_Total =
|
|
81
|
-
VAR _TopN = [Top5_Products_Sales]
|
|
82
|
-
VAR _Total = CALCULATE([TotalSales], ALL(Products))
|
|
83
|
-
RETURN
|
|
84
|
-
DIVIDE(_TopN, _Total)
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
## Bottom N Analysis
|
|
88
|
-
|
|
89
|
-
### Bottom 5 Products
|
|
90
|
-
```dax
|
|
91
|
-
Bottom5_Products_Sales =
|
|
92
|
-
CALCULATE(
|
|
93
|
-
[TotalSales],
|
|
94
|
-
TOPN(
|
|
95
|
-
5,
|
|
96
|
-
ALL(Products[ProductName]),
|
|
97
|
-
[TotalSales],
|
|
98
|
-
ASC
|
|
99
|
-
)
|
|
100
|
-
)
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
### Bottom Performers (Below Threshold)
|
|
104
|
-
```dax
|
|
105
|
-
BelowThreshold_Sales =
|
|
106
|
-
VAR _Threshold = 1000
|
|
107
|
-
RETURN
|
|
108
|
-
CALCULATE(
|
|
109
|
-
[TotalSales],
|
|
110
|
-
FILTER(
|
|
111
|
-
ALL(Products[ProductName]),
|
|
112
|
-
[TotalSales] < _Threshold
|
|
113
|
-
)
|
|
114
|
-
)
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
## "Others" Category
|
|
118
|
-
|
|
119
|
-
### Top 5 + Others
|
|
120
|
-
```dax
|
|
121
|
-
Sales_Top5_Others =
|
|
122
|
-
VAR _CurrentProduct = SELECTEDVALUE(Products[ProductName])
|
|
123
|
-
VAR _Rank = [ProductRank]
|
|
124
|
-
VAR _Sales = [TotalSales]
|
|
125
|
-
RETURN
|
|
126
|
-
IF(
|
|
127
|
-
_Rank <= 5,
|
|
128
|
-
_Sales,
|
|
129
|
-
BLANK()
|
|
130
|
-
)
|
|
131
|
-
|
|
132
|
-
-- Separate measure for "Others"
|
|
133
|
-
Sales_Others =
|
|
134
|
-
VAR _Top5 = [Top5_Products_Sales]
|
|
135
|
-
VAR _Total = CALCULATE([TotalSales], ALL(Products))
|
|
136
|
-
RETURN
|
|
137
|
-
_Total - _Top5
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
## Percentile Rankings
|
|
141
|
-
|
|
142
|
-
### Percentile Rank
|
|
143
|
-
```dax
|
|
144
|
-
PercentileRank =
|
|
145
|
-
VAR _CurrentValue = [TotalSales]
|
|
146
|
-
VAR _AllValues =
|
|
147
|
-
ADDCOLUMNS(
|
|
148
|
-
ALL(Products[ProductName]),
|
|
149
|
-
"@Sales", [TotalSales]
|
|
150
|
-
)
|
|
151
|
-
VAR _CountBelow =
|
|
152
|
-
COUNTROWS(
|
|
153
|
-
FILTER(_AllValues, [@Sales] < _CurrentValue)
|
|
154
|
-
)
|
|
155
|
-
VAR _Total = COUNTROWS(_AllValues)
|
|
156
|
-
RETURN
|
|
157
|
-
DIVIDE(_CountBelow, _Total)
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
### Quartile Assignment
|
|
161
|
-
```dax
|
|
162
|
-
Quartile =
|
|
163
|
-
VAR _Pct = [PercentileRank]
|
|
164
|
-
RETURN
|
|
165
|
-
SWITCH(
|
|
166
|
-
TRUE(),
|
|
167
|
-
_Pct >= 0.75, "Q1 (Top 25%)",
|
|
168
|
-
_Pct >= 0.50, "Q2",
|
|
169
|
-
_Pct >= 0.25, "Q3",
|
|
170
|
-
"Q4 (Bottom 25%)"
|
|
171
|
-
)
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
## Ranking with Ties
|
|
175
|
-
|
|
176
|
-
### Skip Rank (Standard)
|
|
177
|
-
```dax
|
|
178
|
-
Rank_Skip =
|
|
179
|
-
RANKX(
|
|
180
|
-
ALL(Products[ProductName]),
|
|
181
|
-
[TotalSales],
|
|
182
|
-
,
|
|
183
|
-
DESC,
|
|
184
|
-
SKIP -- 1, 2, 2, 4 (skips 3)
|
|
185
|
-
)
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
### Dense Rank
|
|
189
|
-
```dax
|
|
190
|
-
Rank_Dense =
|
|
191
|
-
RANKX(
|
|
192
|
-
ALL(Products[ProductName]),
|
|
193
|
-
[TotalSales],
|
|
194
|
-
,
|
|
195
|
-
DESC,
|
|
196
|
-
DENSE -- 1, 2, 2, 3 (no gaps)
|
|
197
|
-
)
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
## ABC Analysis
|
|
201
|
-
|
|
202
|
-
### ABC Classification
|
|
203
|
-
```dax
|
|
204
|
-
ABC_Class =
|
|
205
|
-
VAR _CumulativePct = [CumulativePct_of_Total]
|
|
206
|
-
RETURN
|
|
207
|
-
SWITCH(
|
|
208
|
-
TRUE(),
|
|
209
|
-
_CumulativePct <= 0.70, "A",
|
|
210
|
-
_CumulativePct <= 0.90, "B",
|
|
211
|
-
"C"
|
|
212
|
-
)
|
|
213
|
-
|
|
214
|
-
-- Supporting measure
|
|
215
|
-
CumulativePct_of_Total =
|
|
216
|
-
VAR _CurrentRank = [ProductRank]
|
|
217
|
-
VAR _CumulativeSales =
|
|
218
|
-
CALCULATE(
|
|
219
|
-
[TotalSales],
|
|
220
|
-
FILTER(
|
|
221
|
-
ALL(Products[ProductName]),
|
|
222
|
-
[ProductRank] <= _CurrentRank
|
|
223
|
-
)
|
|
224
|
-
)
|
|
225
|
-
VAR _TotalSales = CALCULATE([TotalSales], ALL(Products))
|
|
226
|
-
RETURN
|
|
227
|
-
DIVIDE(_CumulativeSales, _TotalSales)
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
## Usage Notes
|
|
231
|
-
|
|
232
|
-
- DENSE vs SKIP: Use DENSE when you need consecutive ranks without gaps
|
|
233
|
-
- Always specify ASC or DESC explicitly for clarity
|
|
234
|
-
- Use ALLEXCEPT for rankings within groups
|
|
235
|
-
- Consider using HASONEVALUE to avoid showing ranks in totals
|