【问题标题】:How to parameterize a column for aggregation in Power BI desktop?如何参数化 Power BI 桌面中的聚合列?
【发布时间】:2020-04-28 09:47:16
【问题描述】:

我有一些用户希望能够修改表格聚合的列。我的问题是我似乎无法在 Power BI 中执行此操作。我基本上希望能够在 SQL 中执行以下操作:

SELECT
    <OrgLevel1>,
    <OrgLevel2>,
    SUM([Revenue])
FROM [Data]
GROUP BY
    <OrgLevel1>,
    <OrgLevel2>
;

用户可以将&lt;OrgLevel1&gt;和/或&lt;OrgLevel2&gt;更改为{"(All)"[Department][Product]}中的任何一个。

此问题可能与此帖子有关:https://community.powerbi.com/t5/Desktop/Calculated-Column-Table-Change-Dynamically-According-to-Slicer/m-p/655991#M314800

这里有一个指向说明此问题的工作簿的链接,TestParameterizeGroupby.pbix(由 Google 云端硬盘托管)。我还在下面的屏幕截图中包含了字段定义。感谢您的帮助。

TestParameterizeGroupby.pbix

链接:TestParameterizeGroupby.pbix(由 Google Drive 托管)

问题

[Org Level 1][Org Level 2] 字段不会根据用户的选择重新计算。仅显示默认值。

表中的预期结果

"Org Level 1", "Org Level 2", "Revenue"
"(All)", "(All)", 28

注意

目的是具有可参数化的组织级别字段,以便报告用户可以按全部、部门、产品或两者按任一顺序汇总。

表和列定义

'Data' = DATATABLE(
    "Department",
    STRING,
    "Product",
    STRING,
    "Revenue",
    DOUBLE,
    {
        {"DeptA", "ProdX", 5.0},
        {"DeptA", "ProdY", 6.0},
        {"DeptB", "ProdX", 10.0},
        {"DeptB", "ProdY", 7.0}
    }
)

'Data'[Org Level 1] = SWITCH(
    'Org Level 1 Parameter'[Org Level 1 Parameter Value],
    0,
    "(All)",
    1,
    [Department],
    2,
    [Product]
)
// Problem: [Org Level 1] and [Org Level 2] fields are not recalculating from the users' selection. Only the default values are shown.
'Org Level 1' = DATATABLE(
    "Org Level 1",
    STRING,
    "Org Level 1 Parameter",
    INTEGER,
    {
        {"(0) (All)", 0},
        {"(1) Department", 1},
        {"(2) Product", 2}
    }
)
'Org Level 1 Parameter'[Org Level 1 Parameter] = GENERATESERIES(0, 2, 1)
'Org Level 1 Parameter'[Org Level 1 Parameter Value] = SELECTEDVALUE('Org Level 1 Parameter'[Org Level 1 Parameter], 1)

表 'Org Level 1' 与列 [Org Level 1 Parameter] 上的 'Org Level 1 Parameter' 具有 1-1 关系。

用户通过选择“Org Level 1”[Org Level 1] 的值来选择“Data”[Org Level 1] 的值。

[Org Level 2] 的表和列的定义方式与 [Org Level 1] 相同。

截图

报告视图:

数据视图:

模型视图:

交叉引用 Power BI 论坛中的帖子: Power BI Forum: How to parameterize a column for aggregation

【问题讨论】:

    标签: group-by parameters powerbi aggregation powerbi-desktop


    【解决方案1】:

    对此的一种解决方案是添加两个列表值参数,并在 Power Query M 代码中使用它们的值来修改数据库查询。假设您有一个表Data,其中包含DepartmentProductRevenue 列。为简单起见,我将再添加一列,名为Dummy Column,所有行都具有相同的值(例如null)。我将在本文后面解释为什么。所以表格看起来像这样:

    然后在您的报告中指定一个查询,将此表添加到您的模型(假设我们将导入它,但通常您也可以在 DirectQuery 中执行此操作):

    现在,如果您查看 M 代码,您将在那里看到上述查询:

    Source = Sql.Database(".", "StackOverflow", [Query=" select ....
    

    现在定义几个参数,最终用户可以使用这些参数来选择应该如何聚合数据。让我们将它们命名为Level 1Level 2

    参数的值可以通过参数名在M中使用,&amp;用于连接字符串。因此,如果参数Name 的值为Samuel,则表达式"Hello, " &amp; Name &amp; "!" 将被评估为Hello, Samuel!。这个想法是检查我们参数的值并相应地修改数据库查询。

    在选择部分,我们将替换所选字段的名称,或者我们将''(空字符串)放在&lt;All&gt;的情况下(我用括号将参数值括起来更容易区分参数值来自数据库字段名称)。所以表达式应该是这样的:

    "select " & (if #"Level 1" = "<Department>" then "Department" else ..." (and so on)
    

    因为我们的参数名称中有空格,所以需要用#""将其包围,所以Level1在代码中可以简单引用为Level1,但是Level 1变成@987654367 @。

    按部分分组有点棘手。我们应该在字段名称之间添加逗号,添加或不添加字段名称,甚至完全省略group by(如果两个参数都设置为&lt;All&gt;)。为了简化这一点,我添加了一个虚拟列,所有行都具有相同的值(例如null)并始终按此列分组。这种方式构建 group by 子句更简单——如果参数值不是&lt;All&gt;,我们应该添加, fieldname。所以代码可能如下所示:

    "group by DummyColumn" & (if #"Level 1" = "<Department>" then ", Department" else ..." (and so on)
    

    所以最后的M代码是这样的:

    let
        Source = Sql.Database(".", "StackOverflow", [Query="select#(lf)    " & (if #"Level 1" = "<Department>" then "Department" else if #"Level 1" = "<Product>" then "Product" else "''") & " as [Org Level 1]#(lf)    , " &  (if #"Level 2" = "<Department>" then "Department" else if #"Level 2" = "<Product>" then "Product" else "''") & " as [Org Level 2]#(lf)    , SUM(Revenue) as Revenue#(lf)from Data#(lf)group by DummyColumn" & (if #"Level 1" = "<Department>" then ", Department" else if #"Level 1" = "<Product>" then ", Product" else "") & (if #"Level 2" = "<Department>" then ", Department" else if #"Level 2" = "<Product>" then ", Product" else "")])
    in
        Source
    

    现在最终用户可以通过点击Edit Queries -> Edit Parameters来更改参数值:

    并选择如何对数据进行分组:

    默认情况下,当执行特定查询时,Power BI Desktop 会第一次警告您:

    如果要关闭此功能,请转到 File -> Options and settings -> Options -> (GLOBAL) Security 并确保未选择 Require user approval for new native database queries

    当最终用户改变参数值时,数据也会改变,例如:

    或者:

    等等……

    当每个用户都有自己的 .pbix 文件副本时,此技巧在 Power BI Desktop 中效果很好。但是,如果您发布它,首先更改参数值不是很方便(您必须转到datasat的设置),更重要的是,更改参数值会影响所有正在查看此报告的用户。您还可以使用它来修改 Power Query 编辑器生成的Table.Group 语句,以防您想在 Power BI 中聚合数据,但更改数据库查询更容易、更灵活。

    如果您想为已发布报告的并发多用户场景启用此场景,您可以使用切片器和What-if parameters。不幸的是,假设参数可以是数字的(您不能在那里定义值列表),因此您可以使用度量来“解码”参数的 int 值并编写一些 DAX 代码以相应地执行不同的聚合。工作量更大,但如果需要,也可以制作。

    【讨论】:

    • 感谢@AndreyNikolov 的快速响应。是否可以在没有数据库连接的情况下重现它?例如,我可以重现这个仅连接到 CSV 文件Data.csv 的附加列“DummyColumn”吗?还是需要数​​据库连接?
    • 对于文件数据源,你必须使用Group by转换,然后使用参数修改底层M代码,但它不会像修改数据库查询那样灵活。另一种选择是进入 DAX 级别并使用假设参数构建一些东西。
    • 感谢安德烈的澄清。我正在使用您的解决方案修改TestParameterizeGroupby.pbix,并测试我是否可以在将答案标记为已接受之前重现它。如果您可以提供指向您的工作簿的链接,那将帮助我验证您的解决方案。再次感谢您的帮助!
    • 当然! This link 将在下个月可用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 2021-08-28
    • 2023-03-09
    • 2023-03-25
    • 2019-06-20
    • 1970-01-01
    相关资源
    最近更新 更多