在 PowerBI KPI 可视化中结合实际数据和计划数据

Combine real and planned data in PowerBI KPI visualizations

我有两个主要数据集:

  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 中执行此操作的惯用方法是什么?


我试过:

给我这个数据:

但这很奇怪,因为这样 KPI 可视化将包括 "Plan" 数据,或者在开始时或更糟的是在结束时将其绘制为 "current" 数字。

预期输出是 KPI 可视化:

我该如何实现?

我的做法:

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

  • 在这些之间建立关系

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

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

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 中的日期 table 构建矩阵:

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

你会得到这样的东西:

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

我会推荐什么:

  1. 拥有table你的真实数据
  2. 有一个 table 的 plan/target 数据,使用月份的最后一天就可以了
  3. 不要将这两个事实 table 直接联系在一起
  4. 相反,有一个单独的日期查找 table,两个 table 都加入其中。此日期维度至少应包含月份和年份列(例如 2017 年 3 月)。
  5. 将两个事实 table 加入你的约会 table
  6. 隐藏您的 2 个事实 table 中的日期字段,这样您就不会想在视觉效果中使用它们(您必须改用查找 table 中的日期字段)

然后您可以创建度量来对实际值和目标值求和。然后是额外的措施,将这 2 项措施相互减去(或将其中一项分成另一项)。然后,所有这些措施都可以按您日期 table 的月份和年份进行分割。 (您也可以按日期对它们进行切片,但由于目标被分配到该月的最后一天,因此该粒度将没有多大帮助。)

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

您可以使用 PowerQuery 转换数据。

"Real" table:

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"

"Plan" table:

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].

如果您需要单独的列 用于计划值和实际值,然后透视 列.

然后在簇状柱形图中使用 GetData 查询即可。