首页 > 解决方案 > 计算 PowerBI 矩阵中相邻列的差异

问题描述

我每周都会为一堆机器提供一些“可用性”数字(百分比)。我的原始 CSV 数据如下所示:

Machine,WW,Availability
A,WW35,0.9
B,WW35,0.95
C,WW35,1
D,WW35,0.87
A,WW36,1
B,WW36,1
C,WW36,0.84
D,WW36,0.94
A,WW37,0.75
B,WW37,0.98
C,WW37,0.91
D,WW37,0.89
A,WW38,1
B,WW38,0.88
C,WW38,0.99
D,WW38,0.95

数据源每周更新一次,并为每台机器添加新的工作周 (WW) 可用性数据。如果该周的可用性 > 90%,则认为机器“通过”。我计算“通过”度量如下。

Pass = 
VAR varCount = CALCULATE(COUNTA(data[Availability]), data[Availability] > 0.9)
RETURN
IF(varCount = BLANK(), 0, varCount)

每周每台机器的通过计数,显示在矩阵中,如下所示(给出上述数据):

在此处输入图像描述

现在,我想为每台机器的这些通过值计算一些数字。我的实际需求有点复杂,但我想要计算的一些最基本的东西如下所示。

为了更好地说明,我将我想要的结果放在一个 Excel 文件中:

在此处输入图像描述

在 PowerBI 社区论坛以及此处,有许多类似的问题,但在所有这些问题中,差异计算似乎都指定了一个常量列名,或日期(在我的情况下为 WW)列的最大/最小值。但我想要的是为每两个相邻的 WW 生成差异,并且随着我的源每周更新,我也想显示新一周的差异。

这可能吗?

编辑

在我尝试了以下@mkRabbani 的答案后,我正在编辑问题以提供更多详细信息。

正如我在评论中解释的那样,它不会让我像你一样创建度量。在DAX中,它不会让我在IF. 但是,我通过创建一些措施来解决这个问题,这相当于Availabilityand PrevAvailability

通过测量

Pass = 
VAR varCount = CALCULATE(COUNTA(data[Availability]), data[Availability] > 0.9)
RETURN
IF(varCount = BLANK(), 0, varCount)

PrevPass 措施

这是上周通过的机器的计数。

PrevPass = 
VAR varCount = CALCULATE(COUNTA(data[PrevAvailability]), data[PrevAvailability] > 0.9)
RETURN
IF(varCount = BLANK(), 0, varCount)

我通过将它们放入矩阵来确认这些值与预期的一样。

在此处输入图像描述

然后我创建了相当于你计算 NewPass 等的度量。

PassFailSteadyColumn = 
IF(
    'data'[PrevPass] = 0,
    BLANK(),
    IF(
        'data'[PrevPass] = 0 && 'data'[Pass] = 1,
        "New Pass",
        IF(
            'data'[PrevPass] = 1 && 'data'[Pass] = 0,
            "New Fail",
            "Steady"
        )
    )
)

到目前为止一切都很好,但是现在当我尝试将其拖放PassFailSteadyColumn到矩阵的Rows字段中时,它根本不允许我这样做。是什么赋予了?

标签: matrixpowerbidaxpowerbi-desktop

解决方案


在Power Query步骤下面执行此操作 -

第 1 步:复制列WW

第 2 步:使用 Fixed 2 字符拆分新列。您的 WW35 现在在WW35两个不同的列中可用。

步骤 3:创建一个新的自定义列= (Spllitted Second Value - 1)。这基本上将返回每行的上一周数。

第4步:现在使用以下关系将表与同一个表合并-

column: **Machine** and **Previous Week**
column: **Machine** and **Week Number (Spllitted Second Value)**

Step-5展开该列并仅保留“Availability”列并将其重命名为Availability Prev Week。您将成为最终输出,如下所示 -

在此处输入图像描述

这是来自高级编辑器的代码供您参考-

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("XdDBCcAgDEDRXXKW0lJTk2O1O3gQ91+jkohGT8Ij+QRLgRcc5Hxje86DoboCcSEUS9Mugc8OURDrrWcMxR3ShLblbUmNvS0FsYA2psZke92Wy9SIbY/2y0iHlpgas43R+Iv6Aw==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Machine = _t, WW = _t, Availability = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Machine", type text}, {"WW", type text}, {"Availability", type number}}),
    #"Duplicated Column" = Table.DuplicateColumn(#"Changed Type", "WW", "WW - Copy"),
    #"Split Column by Position" = Table.SplitColumn(#"Duplicated Column", "WW - Copy", Splitter.SplitTextByPositions({0, 2}, false), {"WW - Copy.1", "WW - Copy.2"}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Position",{{"WW - Copy.1", type text}, {"WW - Copy.2", Int64.Type}}),
    #"Renamed Columns" = Table.RenameColumns(#"Changed Type1",{{"WW - Copy.2", "week number"}}),
    #"Added Custom" = Table.AddColumn(#"Renamed Columns", "prev week number", each [week number] - 1),
    #"Merged Queries" = Table.NestedJoin(#"Added Custom", {"Machine", "prev week number"}, #"Added Custom", {"Machine", "week number"}, "Added Custom", JoinKind.LeftOuter),
    #"Expanded Added Custom" = Table.ExpandTableColumn(#"Merged Queries", "Added Custom", {"Availability"}, {"Added Custom.Availability"}),
    #"Sorted Rows" = Table.Sort(#"Expanded Added Custom",{{"Machine", Order.Ascending}, {"week number", Order.Ascending}}),
    #"Renamed Columns1" = Table.RenameColumns(#"Sorted Rows",{{"Added Custom.Availability", "Availability Prev Week"}})
in
    #"Renamed Columns1"

现在返回报告单击关闭并应用并创建以下 2 个措施-

total_count = count('Table (3)'[Machine])
pass fail steady column = 

if(
    'Table (3)'[Availability Prev Week] = BLANK(),
    BLANK(),
    if(
        'Table (3)'[Availability Prev Week] <= .9 && 'Table (3)'[Availability] > .9,
        "New Pass",
        if(
            'Table (3)'[Availability Prev Week] > .9 && 'Table (3)'[Availability] <= .9,
            "New Fail",
            "Steady"
        )
    )
)

现在配置矩阵如下 -

在此处输入图像描述

这是最终的输出 -

在此处输入图像描述

您可以使用过滤器从视觉中删除红色标记线

在我的示例中,表名被视为Table (3)。相应调整。


推荐阅读