【问题标题】:Power BI, DAX, Many-to-one and relational tablesPower BI、DAX、多对一和关系表
【发布时间】:2020-11-06 20:16:41
【问题描述】:

我之前在这里问过一个问题: DAX subquery measure?

有关如何为可视化创建特定度量列的说明。为了使示例简单,我将其保留在一个虚构的表中,DAX 查询运行良好。

然而,实际上,度量列所针对的可视化是由多个连接表组成的。并且 DAX 查询的结果意外地产生了全零!因此,我将在这里重构我的示例以获得更多帮助...

要求

我想计算特定“构建”有多少“应用程序”不等于“完成”。

数据模型

Builds
Build
App

Apps
App
Status

样本数据

构建

Build...........App
Build1..........App1
Build1..........App2
Build1..........App9
Build2..........App3
Build3..........App1
Build3..........App5
Build3..........App8
Build3..........App9

应用程序

App...........Status
App1..........UAT
App2..........Complete
App9..........New
App3..........Complete
App5..........UAT
App8..........Complete

关系

关系是 MANY Builds.App 与 ONE Apps.App。

可视化表

这是我的可视化 - 请注意不同的表格:

Builds.Build....Builds.App....Apps.Status
Build1..........App1..........UAT
Build1..........App2..........Complete
Build1..........App9..........New
Build2..........App3..........Complete
Build3..........App1..........UAT
Build3..........App5..........UAT
Build3..........App8..........Complete
Build3..........App9..........New

这是我需要的结果:

Builds.Build....Builds.App....Apps.Status....AppsNotCompleteForBuild
Build1..........App1..........UAT............2
Build1..........App2..........Complete.......2
Build1..........App9..........New............2
Build2..........App3..........Complete.......0
Build3..........App1..........UAT............3
Build3..........App5..........UAT............3
Build3..........App8..........Complete.......3
Build3..........App9..........New............3

尝试 1(不工作!)

CALCULATE (
    COUNT ( Builds[App] ),
    FILTER (
        ALL ( Builds[Build], Builds[App] ),
        Builds[Build] = SELECTEDVALUE ( Builds[Build] )            
    ),
    FILTER (
        ALL ( Apps[Status] ),
        Apps[Status] <> "Complete"
    )
) + 0

尝试 2(不工作!)

Measure 5 = CALCULATE (
    COUNT ( Builds[App] ),
    FILTER (
        ALL ( Builds[Build] ),
        Builds[Build] = SELECTEDVALUE ( Builds[Build] )            
    ),
    FILTER (RELATEDTABLE(Apps),
    Apps[Status] <> "Complete")
) + 0

尝试 3(不工作!)

Measure5 = CALCULATE (
   COUNTAX(FILTER( Builds 
            ,  RELATED(Apps[Status]) <>"Complete"  
               && Builds[Build] = SELECTEDVALUE(Builds[Build])
             )  
     ,Builds[App])
) + 0

【问题讨论】:

    标签: powerbi dax


    【解决方案1】:

    在构建和应用程序之间使用多对一关系的这些表

    Builds = 
    DATATABLE(
        "Build", STRING,
        "App", STRING,
        {
            { "Build1", "App1" },
            { "Build1", "App2" },
            { "Build1", "App9" },
            { "Build2", "App3" },
            { "Build3", "App1" },
            { "Build3", "App5" },
            { "Build3", "App8" },
            { "Build3", "App9" }
        }
    )
    
    Apps = 
    DATATABLE(
        "App", STRING,
        "Status", STRING,
        {
            { "App1", "UAT" },
            { "App2", "Complete" },
            { "App9", "New" },
            { "App3", "Complete" },
            { "App5", "UAT" },
            { "App8", "Complete" }
        }
    )
    

    我们可以编写一个 dax 度量来计算每个构建中未处于“完成”状态的应用数量。由于一个应用只能有一个状态,否则多对一关系会中断,因此在计数时过滤掉 status = "Complete" 就足够了。

    # not complete =
    IF(
        HASONEVALUE( Builds[Build] ),
        VAR CurrentBuild =
            SELECTEDVALUE( Builds[Build] )
        RETURN
            COUNTROWS(
                FILTER(
                    ALL( Builds ),
                    Builds[Build] = CurrentBuild
                        && RELATED( Apps[Status] ) <> "Complete"
                )
            ) + 0
    )
    

    通过这个公式,我们可以使用表格视觉来得到这个结果

    编辑:这也将处理应用程序表中缺少应用程序的情况,只是忽略它们

    # not complete = 
    IF(
        HASONEVALUE( Builds[Build] ),
        VAR CurrentBuild =
            SELECTEDVALUE( Builds[Build] )
        VAR CurrentApp =
            SELECTEDVALUE( Apps[App] )
        VAR Result =
            COUNTROWS(
                FILTER(
                    ALLNOBLANKROW( Builds ),
                    Builds[Build] = CurrentBuild
                        && RELATED( Apps[Status] ) <> "Complete"
                        && NOT ISBLANK( RELATED( Apps[Status] ) )
                )
            ) + 0
        RETURN
            IF( NOT ISBLANK( SELECTEDVALUE( Apps[Status] ) ), Result )
    )
    

    【讨论】:

    • 谢谢你......它几乎可以完美运行!我可能没有提到的一件事(道歉)是,并非 Builds 表中的所有应用程序都存在于 Apps 表中。我认为这是在计算那些在 Builds 中但不在 Apps 中的应用程序?这有意义吗?
    • 所以我认为这些应用程序将被忽略,因此不计入
    • 这就像一个魅力。非常感谢您最近几天的帮助。我没有机会开发它,但我学到了很多......
    • 就像有人说的:享受 DAX :)
    • 我在这里问了另一个相关的问题:stackoverflow.com/questions/64774945/…
    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 2021-12-18
    • 2022-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多