DAX:Return 基于其他条件的不同列值
DAX: Return distinct column values based on other conditions
我有一个 table,其相关列是:ProjectName、TaskNo、AssignedTo 和 Status。数据看起来像这样:
--------------------------------------------------------------
| ProjectName | TaskNo | AssignedTo | Status |
+-----------------+------------+----------------+------------+
| Project1 | 00300 | Database | In Process |
+-----------------+------------+----------------+------------+
| Project2 | 02200 | Alfred | In Process |
+-----------------+------------+----------------+------------+
| Project2 | 00300 | Database | In Process |
+-----------------+------------+----------------+------------+
| Project3 | 02200 | Alfred | Complete |
+-----------------+------------+----------------+------------+
| Project3 | 00900 | Database | In Process |
+-----------------+------------+----------------+------------+
| Project4 | 02200 | Alfred | Complete |
+-----------------+------------+----------------+------------+
| Project4 | 01200 | Database | Complete |
+-----------------+------------+----------------+------------+
| Project4 | 00300 | Database |Not Started |
+-----------------+------------+----------------+------------+
每个项目大约有两打任务编号,分配给许多不同的组。
我希望输出 ProjectName 列表,其中
TaskNo 02200 的状态为 Complete AND
至少有 1 个分配给数据库的任务未完成。
根据上面的 table,我想要的输出是:
-------------------
| ProjectName |
+-----------------+
| Project3 |
+-----------------+
| Project4 |
-------------------
我已经设法将非常大的列表过滤掉一些 - 使用此 FILTER
表达式完成 02200 和未完成的数据库任务:
FILTER (
'Project Tasks',
OR (
'Project Tasks'[Title] = "02200"
&& 'Project Tasks'[Status] = "Completed",
'Project Tasks'[GroupAssignedTo] = "Database"
&& 'Project Tasks'[Status] <> "Completed"
)
)
我似乎无法完成剩下的工作 - 在这个过滤后的 table 中找到满足两个条件的。
诀窍在于您需要考虑一组中的每个 ProjectName
,而不是逐行考虑。
为此,让我们使用 SUMMARIZE function:
FilteredProjects =
VAR Summary =
SUMMARIZE (
'Project Tasks',
'Project Tasks'[ProjectName],
"02200 Complete", COUNTROWS (
FILTER (
'Project Tasks',
'Project Tasks'[TaskNo] = "02200"
&& 'Project Tasks'[Status] = "Complete"
)
) > 0,
"Database Not Complete", COUNTROWS (
FILTER (
'Project Tasks',
'Project Tasks'[AssignedTo] = "Database"
&& 'Project Tasks'[Status] <> "Complete"
)
) > 0
)
RETURN
SELECTCOLUMNS (
FILTER ( Summary, [02200 Complete] && [Database Not Complete] ),
"ProjectName", 'Project Tasks'[ProjectName]
)
因此,对于每个 ProjectName
组,您检查该子table 是否有任何符合指定条件的行。然后,您可以筛选出同时满足这两个条件的列,然后只抽出您想要的一列。
下面是 Summary
table 在过滤并剥离到一列之前的样子:
-----------------------------------------------------------------
| ProjectName | 0200 Complete | Database Not Complete |
+-----------------+------------------+--------------------------+
| Project1 | False | True |
+-----------------+------------------+--------------------------+
| Project2 | False | True |
+-----------------+------------------+--------------------------+
| Project3 | True | True |
+-----------------+------------------+--------------------------+
| Project4 | True | True |
-----------------------------------------------------------------
我有一个 table,其相关列是:ProjectName、TaskNo、AssignedTo 和 Status。数据看起来像这样:
--------------------------------------------------------------
| ProjectName | TaskNo | AssignedTo | Status |
+-----------------+------------+----------------+------------+
| Project1 | 00300 | Database | In Process |
+-----------------+------------+----------------+------------+
| Project2 | 02200 | Alfred | In Process |
+-----------------+------------+----------------+------------+
| Project2 | 00300 | Database | In Process |
+-----------------+------------+----------------+------------+
| Project3 | 02200 | Alfred | Complete |
+-----------------+------------+----------------+------------+
| Project3 | 00900 | Database | In Process |
+-----------------+------------+----------------+------------+
| Project4 | 02200 | Alfred | Complete |
+-----------------+------------+----------------+------------+
| Project4 | 01200 | Database | Complete |
+-----------------+------------+----------------+------------+
| Project4 | 00300 | Database |Not Started |
+-----------------+------------+----------------+------------+
每个项目大约有两打任务编号,分配给许多不同的组。 我希望输出 ProjectName 列表,其中
TaskNo 02200 的状态为 Complete AND 至少有 1 个分配给数据库的任务未完成。
根据上面的 table,我想要的输出是:
-------------------
| ProjectName |
+-----------------+
| Project3 |
+-----------------+
| Project4 |
-------------------
我已经设法将非常大的列表过滤掉一些 - 使用此 FILTER
表达式完成 02200 和未完成的数据库任务:
FILTER (
'Project Tasks',
OR (
'Project Tasks'[Title] = "02200"
&& 'Project Tasks'[Status] = "Completed",
'Project Tasks'[GroupAssignedTo] = "Database"
&& 'Project Tasks'[Status] <> "Completed"
)
)
我似乎无法完成剩下的工作 - 在这个过滤后的 table 中找到满足两个条件的。
诀窍在于您需要考虑一组中的每个 ProjectName
,而不是逐行考虑。
为此,让我们使用 SUMMARIZE function:
FilteredProjects =
VAR Summary =
SUMMARIZE (
'Project Tasks',
'Project Tasks'[ProjectName],
"02200 Complete", COUNTROWS (
FILTER (
'Project Tasks',
'Project Tasks'[TaskNo] = "02200"
&& 'Project Tasks'[Status] = "Complete"
)
) > 0,
"Database Not Complete", COUNTROWS (
FILTER (
'Project Tasks',
'Project Tasks'[AssignedTo] = "Database"
&& 'Project Tasks'[Status] <> "Complete"
)
) > 0
)
RETURN
SELECTCOLUMNS (
FILTER ( Summary, [02200 Complete] && [Database Not Complete] ),
"ProjectName", 'Project Tasks'[ProjectName]
)
因此,对于每个 ProjectName
组,您检查该子table 是否有任何符合指定条件的行。然后,您可以筛选出同时满足这两个条件的列,然后只抽出您想要的一列。
下面是 Summary
table 在过滤并剥离到一列之前的样子:
-----------------------------------------------------------------
| ProjectName | 0200 Complete | Database Not Complete |
+-----------------+------------------+--------------------------+
| Project1 | False | True |
+-----------------+------------------+--------------------------+
| Project2 | False | True |
+-----------------+------------------+--------------------------+
| Project3 | True | True |
+-----------------+------------------+--------------------------+
| Project4 | True | True |
-----------------------------------------------------------------