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                   |
-----------------------------------------------------------------