【问题标题】:How to create a DAX measure that computes cumulative sum and is also responsive to the evaluation context in Power BI如何创建一个 DAX 度量来计算累积总和并响应 Power BI 中的评估上下文
【发布时间】:2021-03-17 22:53:29
【问题描述】:

让我们考虑一个项目管理场景,其中项目状态从 Open (1) 变为 In-Progress (2),最后是 Closed (3)。在这个例子中,我有 10 个项目。我的要求是根据日期和/或状态类型生成项目计数。这里的关键是度量返回的值与评估上下文相关。

这是项目状态表:

现在看看下面的表格,至少部分是预期的结果。

例如:2 月 6 日,我们在系统中有 4 个项目,其中 2 个处于打开状态,1 个正在进行中,1 个已关闭。截至 2 月 6 日,这给了我总共 4 个项目。它查看 7 行的数据,即 self 和前 6 行。如果我想知道截至今天的项目状态,我们只需要查看 12 月 24 日的最后一个条目,它会给我 10 个。

当我在没有日期和状态类型列的表格上显示计算项目数量的度量时,我希望值为 10。在这种情况下,我的上下文过滤器没有日期和状态类型可供过滤.

如果我的可视化(矩阵)只有 Status Type 作为我期望的列字段:

如果我的矩阵将日期作为行字段,将状态类型作为列字段,那么我希望看到我之前显示的内容。

我诚挚地希望您能就应对这一挑战的最佳方式提出建议。作为第一次尝试,我想出了一些东西,它并没有给我带来我期望的东西,而是试图解决我所拥有的东西,如果我以正确的方式解决这个问题,我将不胜感激您的 cmets。

Project Status Count = 

VAR MaxKnownDate =
    MAX ( 'Project Status'[Status Date] )

VAR StatusSummaryBase =
    SUMMARIZE (
        'Date'
        ,'Date'[Date]
    )
    
 VAR StatusSummary =
    CALCULATETABLE (
        ADDCOLUMNS (
            StatusSummaryBase,
              "Latest Count", 
              VAR DateSnapshot = 'Date'[Date]
              RETURN
                CALCULATE (
                    COUNTX (
                         'Project Status',
                          'Project Status'[Project Id]
                          ),
                    LASTNONBLANK (
                        FILTER(
                            ALL('Date'),
                            'Date'[Date] <= DateSnapshot
                        ),
                        COUNTROWS(RELATEDTABLE('Project Status'))
                    )
                )
            
        )
        ,FILTER (
            ALL ( 'Project Status'[Status Date] ),
            'Project Status'[Status Date] <= MaxKnownDate
        )
    )       

VAR Result =
    SUMX(StatusSummary, [Latest Count])
    
RETURN
    Result

我知道我可能仍需要检查是否存在上下文过滤器,例如数据和状态类型,以便进行正确的计算。

【问题讨论】:

  • 3 月 15 日,我可以看到项目 id 2,3 和 5 已打开。那天你是如何在 Open (1) 列中获得 2 分的?

标签: powerbi dax


【解决方案1】:

按照以下步骤来实现您所需的输出-

第 1 步:使用以下代码创建一个计算列-

date_part = 
DATE(
    YEAR(your_table_name[status date]),
    MONTH(your_table_name[status date]),
    DAY(your_table_name[status date])
)

第 2 步:现在在 4 个 Measures-

下创建这个
Open (1) = 

var current_row_pid = MIN('your_table_name'[project id])
var current_row_date_part = MIN('your_table_name'[date_part])

var _table1 = 
SUMMARIZE(
    FILTER(
        ALL('your_table_name'),
        'your_table_name'[date_part] <= current_row_date_part
    ),
    'your_table_name'[project id],
    "project status id", MAX('your_table_name'[project status id])
)

var _table2 = 
ADDCOLUMNS(
    _table1,
    "status type id", 
    LOOKUPVALUE(
        'your_table_name'[status type id],
        'your_table_name'[project id],[project id],
        'your_table_name'[project status id],[project status id]
    )
)

RETURN 
COUNTROWS(
    FILTER(
        _table2,
        [status type id] = 1
    )
) + 0
in-progress (2) = 

var current_row_pid = MIN('your_table_name'[project id])
var current_row_date_part = MIN('your_table_name'[date_part])

var _table1 = 
SUMMARIZE(
    FILTER(
        ALL('your_table_name'),
        'your_table_name'[date_part] <= current_row_date_part
    ),
    'your_table_name'[project id],
    "project status id", MAX('your_table_name'[project status id])
)

var _table2 = 
ADDCOLUMNS(
    _table1,
    "status type id", 
    LOOKUPVALUE(
        'your_table_name'[status type id],
        'your_table_name'[project id],[project id],
        'your_table_name'[project status id],[project status id]
    )
)

RETURN 
COUNTROWS(
    FILTER(
        _table2,
        [status type id] = 2
    )
) + 0
closed (3) = 

var current_row_pid = MIN('your_table_name'[project id])
var current_row_date_part = MIN('your_table_name'[date_part])

var _table1 = 
SUMMARIZE(
    FILTER(
        ALL('your_table_name'),
        'your_table_name'[date_part] <= current_row_date_part
    ),
    'your_table_name'[project id],
    "project status id", MAX('your_table_name'[project status id])
)

var _table2 = 
ADDCOLUMNS(
    _table1,
    "status type id", 
    LOOKUPVALUE(
        'your_table_name'[status type id],
        'your_table_name'[project id],[project id],
        'your_table_name'[project status id],[project status id]
    )
)

RETURN 
COUNTROWS(
    FILTER(
        _table2,
        [status type id] = 3
    )
) + 0
total_project = [Open (1)] + [in-progress (2)] + [closed (3)]

这是最终的输出-

【讨论】:

  • 伙计,你的计算绝对准确。做得好!很抱歉我在帖子上的计算有点偏差。
  • 嗨@user1309226,请获取我更新的答案以及所有必要的列和度量代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
相关资源
最近更新 更多