首页 文章

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

提问于
浏览
3

我有两个主要数据集:

  • 包含所有销售交易的实际数据 .

例如 RealData

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

等等 .

  • 我希望实现总销售额的计划,每个月的最后一天总计 .

例如 EndOfMonthTargets

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

等等 .

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

我要做的是展示KPI可视化:真实数据与计划的对比情况如何 . 但是,我无法弄清楚如何关联这两个数据集,因为它们实际上不能连接在一起 .

What is the idiomatic way to do this in PowerBI?


我试过了:

  • 为每个来源添加一个列及其各自的状态( "real" vs "plan"

  • 创建一个联盟(即"Append Queries as New")

  • 添加一列 Month = MONTH([Date])

给我这个数据:

sample unioned data

但这很奇怪,因为KPI可视化将包括“计划”数据,无论是在开始还是在结束时,它将被绘制为“当前”数字 .

预期输出是KPI可视化:

  • 显示按年份(或月份,如果我的切片器设置为那样)的总销售额的绝对数量!)

  • ,从计划数据中检索 Target goals

  • 具有基于前几年的趋势(不包括在我的样本数据中)

我如何实现这一目标?

4 回答

  • 2

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

    我会推荐什么:

    • 有一张真实数据表

    • 有一个您的计划/目标数据表,使用该月的最后一天是好的

    • 不要直接将这两个事实表联系起来

    • 而是,有一个单独的日期查找表,两个表都连接到这个表 . 此日期维度至少应包含月份和年份列(例如2017年3月) .

    • 将两个事实表加入日期表

    • 隐藏2个事实表中的日期字段,这样您就不会想要在视觉效果中使用它们(您必须使用查找表中的日期字段)

    然后,您可以创建度量以汇总实际和目标 . 然后是额外的措施,相互减去这两个措施(或将一个措施分成另一个) . 然后,所有这些措施都可以按日期表上的月份和年份进行分割 . (您也可以按日期对它们进行切片,但由于目标已分配到该月的最后一天,因此该粒度将不会有用 . )

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

  • 1

    我会这样做的方式:

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

    • 在这些之间创建关系

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

    enter image description here

    enter image description here

    enter image description here

    enter image description here

  • 2

    您可以使用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] .

    如果您需要 separate columns 用于计划和实际值,请转动源列 .

    然后只在集群柱形图中使用GetData查询 .

  • 1

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

    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表中的Date来构建矩阵:

    enter image description here

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

    enter image description here

    你会得到这样的东西:

    enter image description here

相关问题