[英]how to get running sum/cumulative sum of a measure in power bi using DAX (direct query)
[英]How to create a DAX measure that computes cumulative sum and is also responsive to the evaluation context in Power BI
讓我們考慮一個項目管理場景,其中項目狀態從 Open (1) 變為 In-Progress (2),最后是 Closed (3)。 在這個例子中,我有 10 個項目。 我的要求是根據日期和/或狀態類型生成項目計數。 這里的關鍵是度量返回的值與評估上下文相關。
這是項目狀態表:
現在看看下面的表格,至少部分是預期的結果。
例如:2 月 6 日,我們在系統中有 4 個項目,其中 2 個處於打開狀態,1 個正在進行中,1 個已關閉。 截至 2 月 6 日,這給了我總共 4 個項目。它查看 7 行的數據,即 self 和前 6 行。 如果我想知道截至今天的項目狀態,我們只需要查看 12 月 24 日的最后一個條目,它會給我 10 個。
當我在沒有日期和狀態類型列的表上顯示計算項目數量的度量時,我希望值為 10。在這種情況下,我的上下文過濾器沒有日期和狀態類型可供過濾。
如果我的可視化(矩陣)只有狀態類型作為我期望的列字段:
如果我的矩陣將日期作為行字段,將狀態類型作為列字段,那么我希望看到我之前顯示的內容。
我懇切地要求您就應對這一挑戰的最佳方式提出建議。 作為第一次嘗試,我想出了一些東西,它並沒有讓我沒有達到我的期望,而是試圖解決我所擁有的東西,如果我以正確的方式解決這個問題,我將不勝感激。
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
我知道我可能仍需要檢查上下文過濾器(例如數據和狀態類型)的存在,以便生成正確的計算。
請按照以下步驟實現您所需的輸出 -
步驟 1:使用以下代碼創建一個計算列-
date_part =
DATE(
YEAR(your_table_name[status date]),
MONTH(your_table_name[status date]),
DAY(your_table_name[status date])
)
第 2 步:現在在以下 4 個措施下創建 -
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)]
這是最終的輸出 -
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.