基于DAX按状态计算产品累计数量(无日期维度)
无日期维度下按状态累计统计产品数量的DAX实现
需求说明
在无日期维度的场景中,使用DAX语言按状态(Status)对产品数量进行累计统计,现有包含14个产品的数据集如下:
输入数据
| ProductID | Days Since LastPurchase | Status |
|---|---|---|
| 307255900 | 76 | 60 - 180 days |
| 525220000 | 59 | 30 - 60 days |
| 209500000 | 20 | < 30 days |
| 312969600 | 151 | 60 - 180 days |
| 249300000 | 52 | 30 - 60 days |
| 210100000 | 52 | 30 - 60 days |
| 304851400 | 150 | 60 - 180 days |
| 304851600 | 150 | 60 - 180 days |
| 314152700 | 367 | > 180 days |
| 405300000 | 90 | 60 - 180 days |
| 314692300 | 90 | 60 - 180 days |
| 314692400 | 53 | 30 - 60 days |
| 524270000 | 213 | > 180 days |
| 524280000 | 213 | > 180 days |
期望输出
| Status | Cumulative Count |
|---|---|
| < 30 days | 1 |
| > 180 days | 4 |
| 30 - 60 days | 8 |
| 60 - 180 days | 14 |
解决方案
由于无日期维度,累计统计需要基于状态的自定义排序逻辑实现,以下提供两种可行方案:
方案1:创建状态排序表(推荐)
- 新建计算表定义状态的排序规则:
状态排序表 = DATATABLE( "Status", STRING, "SortOrder", INTEGER, { {"< 30 days", 1}, {"> 180 days", 2}, {"30 - 60 days", 3}, {"60 - 180 days", 4} } )
- 在数据模型中,将
状态排序表[Status]与原产品表的Status列建立关系。 - 创建DAX度量值计算累计数量:
Cumulative Count = VAR CurrentSort = SELECTEDVALUE('状态排序表'[SortOrder]) RETURN CALCULATE( DISTINCTCOUNT('产品表'[ProductID]), FILTER( ALL('状态排序表'), '状态排序表'[SortOrder] <= CurrentSort ) )
方案2:直接在度量值中定义排序逻辑
无需额外建表,直接在度量值内嵌入状态排序规则:
Cumulative Count = VAR CurrentStatus = SELECTEDVALUE('产品表'[Status]) VAR CurrentSort = SWITCH( CurrentStatus, "< 30 days", 1, "> 180 days", 2, "30 - 60 days", 3, "60 - 180 days", 4 ) RETURN CALCULATE( DISTINCTCOUNT('产品表'[ProductID]), FILTER( ALL('产品表'[Status]), SWITCH( '产品表'[Status], "< 30 days", 1, "> 180 days", 2, "30 - 60 days", 3, "60 - 180 days", 4 ) <= CurrentSort ) )
结果验证
将度量值与Status列放入可视化组件后,即可得到与期望输出完全一致的累计统计结果:
< 30 days:仅统计自身,累计1> 180 days:统计< 30 days+> 180 days,累计1+3=430 - 60 days:统计前两类 + 自身,累计4+4=860 - 180 days:统计所有状态,累计8+6=14
内容的提问来源于stack exchange,提问作者Ivan Alducin
相关产品推荐
相关产品推荐

