【问题标题】:Combine real and planned data in PowerBI KPI visualizations在 Power BI KPI 可视化中结合实际数据和计划数据
【发布时间】:2017-03-08 09:50:54
【问题描述】:

我有两个主要数据集:

  1. 所有销售交易的真实数据。

    例如RealData:

    Date;Sales
    16-01-2017;1200
    20-01-2017;1500
    05-02-2017;800
    08-02-2017;1100
    13-02-2017;300
    

    等等

  2. 一个计划,其中包含我想要实现的总销售额,每个月最后一天的总销售额。

    例如EndOfMonthTargets:

    Date;Sales
    31-01-2017;3000
    28-02-2017;2500
    

    等等

在我的真实数据中,我 (a) 也有 2017 年之前的数据,显然我有 2017 年每个月的目标。RealData 始终是实时/最新的。

我要做的是展示 KPI 可视化:真实数据与计划的表现如何。但是,我不知道如何关联这两个数据集,因为它们不能真正连接在一起。

在 PowerBI 中执行此操作的惯用方式是什么?


我试过了:

  • 为每个来源添加一列及其各自的状态("real""plan"
  • 创建联合(即“将查询附加为新”)
  • 添加列Month = MONTH([Date])

给我这个数据:

但这很奇怪,因为 KPI 可视化将在开始时包含“计划”数据,或者在末尾包含“计划”数据,并将其绘制为“当前”数字。

预期的输出是 KPI 可视化:

  • 显示按年(或按月,如果我的切片器是这样设置的话!)的绝对销售额总和
  • 从计划数据中检索到Target goals
  • 具有基于前几年的趋势(未包含在我的示例数据中)

我如何做到这一点?

【问题讨论】:

  • 我不清楚,您想将 2017 年 1 月的真实数据总销售额与 31-01-2017 - 3000 进行比较吗?如果您包含预期结果,这将很有用。
  • @alejandrozuleta 您的假设是正确的。我试图在我的最后一段中包含预期的结果,将尝试加强我的问题。但基本上,是的:如果我的切片器设置为“一月”,那么我希望我的 KPI 显示实际数字为 2700,并将其设为红色,显示相对于 1 月底拥有 3000 的计划为 -300。

标签: powerbi


【解决方案1】:

有几种方法可以像这样连接表格。您拥有的是 2 个具有不同粒度的表:一个针对当天的销售表,以及一个针对月的目标表。将它们相互建模是一个常见的请求,归结为拥有一个两个事实表都可以加入的查找表。

我的建议:

  1. 有一个真实数据表
  2. 有一个计划/目标数据表,使用当月的最后一天就可以了
  3. 不要将这 2 个事实表直接关联在一起
  4. 相反,有一个单独的日期查找表,两个表都连接到该表。此日期维度至少应包含月份和年份列(例如 2017 年 3 月)。
  5. 将两个事实表加入您的日期表
  6. 隐藏 2 个事实表中的日期字段,以免在视觉效果中使用它们(您必须改用查找表中的日期字段)

然后,您可以创建度量以求和您的实际值和目标值。然后是额外的措施,将这两个措施相互减去(或将一个分成另一个)。然后,所有这些度量都将在您的日期表上按月份和年份进行切片。 (您也可以按日期对它们进行切片,但由于目标被分配到该月的最后一天,因此这种粒度将无济于事。)

这里有很多很好的信息和示例:http://www.daxpatterns.com/handling-different-granularities/

【讨论】:

  • 其他答案也很有帮助,尽管这个答案缺少一些细节,但它我在当前解决方案中采用的路线。 (虽然我作弊并使用了 DAX 查找函数而不是第 4 步中的查找表。但我可能会全力以赴并在以后的版本中使用它。)
  • 你的问题的症结在于连接,所以我承认我的答案集中在这个问题上,而不是如何建立度量/KPI。很高兴您能正常使用并感谢您的反馈。
【解决方案2】:

我会这样做的方式:

  • realtargets 表添加计算列:
    Month = Date(Actual[Date].[Year],Actual[Date].[MonthNo],1)
    Month = Date(Target[Date].[Year],Target[Date].[MonthNo],1)

  • 在这些之间建立关系

  • 针对Target[Month]绘制SUM(RealData[Sales])Target[Sales]

【讨论】:

  • 您能否详细说明一下,或者添加一两个屏幕截图,这在实践中是如何工作的?我根本无法让它工作......
  • 抱歉,回读我的评论似乎有点粗鲁(不是故意的!)。我非常感谢您的建议,但我很难使用您的答案在我的场景中构建一个真正的解决方案。我遇到的一些问题(d)是Month 公式似乎没有按原样工作(需要MonthDayOne = DATE(YEAR([Date]); MONTH([Date]); 1)),同时我添加了 2016 年的数据,这使解决方案无法解决。答案中的更多细节会有很大帮助。
  • 不用担心。抱歉 - 我确实把公式弄错了。应该是固定的;希望截图有帮助。如果这仍然不起作用,我们很乐意提供进一步的帮助。
  • 谢谢,编辑帮助。我确实需要 KPI 可视化(我的部分问题/问题是如何配置该可视化),但我看到您的解决方案也将提供适当的见解。您的回答确实帮助我理解了我的问题。
【解决方案3】:

您可以使用 PowerQuery 转换数据。

“真实”表:

let
    Source = Table.FromRecords({[Date="16.01.2017", Sales = 1200], [Date="20.01.2017", Sales=1500], [Date="05.02.2017", Sales = 800], [Date="08.02.2017", Sales = 1100], [Date="13.02.2017", Sales = 300], [Date="10.01.2016", Sales = 1400], [Date="02.02.2016", Sales = 1800]}),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Date", type date}, {"Sales", Int64.Type}})
in
    #"Changed Type"

“计划”表:

let
    Source = Table.FromRecords({[Date="31.01.2017", Sales = 3000], [Date="28.02.2017", Sales=2500], [Date="31.01.2016", Sales = 2800], [Date="29.02.2016", Sales = 2700]}),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Date", type date}, {"Sales", Int64.Type}})
in
    #"Changed Type"

您获取数据的查询,我们将其命名为 GetData:

let
    t1 = Table.AddColumn(Real, "Source", each "Real"),
    t2 = Table.AddColumn(Plan, "Source", each "Plan"),
    MergedTable = Table.Combine({t1, t2}),
    AddYear = Table.AddColumn(MergedTable, "Year", each Date.Year([Date])),
    AddMonth = Table.AddColumn(AddYear, "Month", each Date.Month([Date])),
    Group = Table.Group(AddMonth, {"Year", "Month", "Source"}, {{"Sales", each List.Sum([Sales]), type number}})

in
    Group

您可以通过在报告级别对结果进行分组来避免使用最后一步,但这将使用户能够查看每笔销售的金额。如果这是预期行为,只需删除 Group 步骤,或将其替换为 Table.RemoveColumn 以删除 [Date]。

如果您需要 单独的列 用于计划值和实际值,则旋转 Source 列。

然后在聚集柱形图中使用 GetData 查询。

【讨论】:

    【解决方案4】:

    您必须创建一个度量来计算实际总数,并创建一个度量来计算每个月或月底的计划。然后创建一个度量来比较计划总计和实际总计之间的差异。

    Actual =
    CALCULATE (
        SUM ( RealDate[Sales] ),
        FILTER (
            ALL ( RealDate ),
            MONTH ( [Date] ) = MONTH ( MAX ( EndOfMonthTargets[Date] ) )
                && YEAR ( [Date] ) = YEAR ( MAX ( EndOfMonthTargets[Date] ) )
        )
    )
    

    Planned = SUM(EndOfMonthTargets[Sales])
    

    ActualVSPlanned = [Actual] - [Planned]
    

    现在使用该度量值和 eEndOfMonthTargets 表中的日期来构建矩阵:

    对于 ActualVSPlanned 度量,使用如下条件格式:

    你会得到这样的东西:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-31
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 2017-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多