通过对列中的值进行分组来显示数据
Show data by grouping values in a column
我正在从事 PowerBI 项目,以分析我们的一个应用程序生成的一些警报日志数据。为了简洁起见,如果您摆脱了所有混乱,这就是典型日志的样子。
TimeStamp,Unit,Alarm,Machine
2020/02/25 13:33:45,A,Error,M1
2020/02/25 13:33:46,B,Error,M1
2020/02/25 13:33:47,C,Serious Error,M2
2020/02/25 13:33:48,A,Warning,M4
2020/02/25 13:33:49,C,Information,M3
2020/02/25 13:33:50,B,Information,M1
2020/02/25 13:33:51,D,Warning,M1
2020/02/25 13:33:52,E,Error,M2
2020/02/25 13:33:53,A,Serious Error,M4
2020/02/25 13:33:54,C,Dead Serious Error,M5
2020/02/25 13:33:55,B,Serious Error,M2
2020/02/25 13:33:56,B,Warning,M1
2020/02/25 13:33:57,D,Information,M3
2020/02/25 13:33:58,A,Warning,M2
2020/02/25 13:33:59,C,Error,M1
2020/02/25 13:34:00,E,Error,M2
2020/02/25 13:34:01,C,Critical Error,M4
2020/02/25 13:34:02,A,Critical Error,M5
2020/02/25 13:34:03,B,Error,M4
2020/02/25 13:34:04,C,Warning,M2
在设计器中,如果我想按计数显示警报,我可以简单地创建一个带有 Axis = Alarm
和 Value = Count of Alarm
的柱形图,这将得到以下内容。
这绝对没问题。
但是,如果我想生成一个类似的图表,但警报按警报文本分组怎么办?例如,假设这些是我的群组。
Errors - Any alarm that contains the word 'error'.
Warnings - Any alarm that contains the word 'warning'.
Other - Everything else.
这意味着上面的日志将分为 3 类,它应该如下所示。
我通过手动创建另一个日志文件生成了上面的内容,我不想在我的真实项目中这样做。我将如何实现这一目标?
我知道 GroupBy
函数存在于查询编辑器中,但它似乎没有提供我需要的结果。
编辑
请注意,在我的真实日志中有数百个(如果不是数千个)不同的警报,而且我还可能从不同的地方获取每日日志,其中每个新日志都可能包含以前不存在的警报。不幸的是,我没有全面的警报列表,因此创建静态 table 并分组警报不是一个选项。
您可以在查询编辑器中创建计算列或使用 DAX 对这些列进行分组,然后使用该计算列代替 Alarm
作为您的轴。
以下是如何使用 DAX 执行此操作的示例:
Group =
SWITCH (
TRUE (),
CONTAINSSTRING ( 'Table'[Alarm], "Error" ), "Errors",
CONTAINSSTRING ( 'Table'[Alarm], "Warning" ), "Warnings",
"Other"
)
这 SWITCH
returns 第一行的值等于 TRUE()
。此处有更多详细信息:
DAX – The Diabolical Genius of “SWITCH TRUE”
您也可以使用 M 代码在查询编辑器中使用自定义列,如下所示:
if Text.Contains([Alarm], "Error") then "Errors"
else if Text.Contains([Alarm], "Warning") then "Warnings"
else "Other"
注意:M代码区分大小写,而DAX不区分大小写。
我正在从事 PowerBI 项目,以分析我们的一个应用程序生成的一些警报日志数据。为了简洁起见,如果您摆脱了所有混乱,这就是典型日志的样子。
TimeStamp,Unit,Alarm,Machine
2020/02/25 13:33:45,A,Error,M1
2020/02/25 13:33:46,B,Error,M1
2020/02/25 13:33:47,C,Serious Error,M2
2020/02/25 13:33:48,A,Warning,M4
2020/02/25 13:33:49,C,Information,M3
2020/02/25 13:33:50,B,Information,M1
2020/02/25 13:33:51,D,Warning,M1
2020/02/25 13:33:52,E,Error,M2
2020/02/25 13:33:53,A,Serious Error,M4
2020/02/25 13:33:54,C,Dead Serious Error,M5
2020/02/25 13:33:55,B,Serious Error,M2
2020/02/25 13:33:56,B,Warning,M1
2020/02/25 13:33:57,D,Information,M3
2020/02/25 13:33:58,A,Warning,M2
2020/02/25 13:33:59,C,Error,M1
2020/02/25 13:34:00,E,Error,M2
2020/02/25 13:34:01,C,Critical Error,M4
2020/02/25 13:34:02,A,Critical Error,M5
2020/02/25 13:34:03,B,Error,M4
2020/02/25 13:34:04,C,Warning,M2
在设计器中,如果我想按计数显示警报,我可以简单地创建一个带有 Axis = Alarm
和 Value = Count of Alarm
的柱形图,这将得到以下内容。
这绝对没问题。 但是,如果我想生成一个类似的图表,但警报按警报文本分组怎么办?例如,假设这些是我的群组。
Errors - Any alarm that contains the word 'error'.
Warnings - Any alarm that contains the word 'warning'.
Other - Everything else.
这意味着上面的日志将分为 3 类,它应该如下所示。
我通过手动创建另一个日志文件生成了上面的内容,我不想在我的真实项目中这样做。我将如何实现这一目标?
我知道 GroupBy
函数存在于查询编辑器中,但它似乎没有提供我需要的结果。
编辑
请注意,在我的真实日志中有数百个(如果不是数千个)不同的警报,而且我还可能从不同的地方获取每日日志,其中每个新日志都可能包含以前不存在的警报。不幸的是,我没有全面的警报列表,因此创建静态 table 并分组警报不是一个选项。
您可以在查询编辑器中创建计算列或使用 DAX 对这些列进行分组,然后使用该计算列代替 Alarm
作为您的轴。
以下是如何使用 DAX 执行此操作的示例:
Group =
SWITCH (
TRUE (),
CONTAINSSTRING ( 'Table'[Alarm], "Error" ), "Errors",
CONTAINSSTRING ( 'Table'[Alarm], "Warning" ), "Warnings",
"Other"
)
这 SWITCH
returns 第一行的值等于 TRUE()
。此处有更多详细信息:
DAX – The Diabolical Genius of “SWITCH TRUE”
您也可以使用 M 代码在查询编辑器中使用自定义列,如下所示:
if Text.Contains([Alarm], "Error") then "Errors"
else if Text.Contains([Alarm], "Warning") then "Warnings"
else "Other"
注意:M代码区分大小写,而DAX不区分大小写。