在 PowerBI KPI 可视化中结合实际数据和计划数据
Combine real and planned data in PowerBI KPI visualizations
我有两个主要数据集:
包含所有销售交易的真实数据。
例如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 可视化:实际数据与计划的对比情况。但是,我无法弄清楚如何将这两个数据集关联起来,因为它们无法真正结合在一起。
在 PowerBI 中执行此操作的惯用方法是什么?
我试过:
- 为每个来源添加一列及其各自的状态(
"real"
对比 "plan"
)
- 创建联合(即 "Append Queries as New")
- 添加一列
Month = MONTH([Date])
给我这个数据:
但这很奇怪,因为这样 KPI 可视化将包括 "Plan" 数据,或者在开始时或更糟的是在结束时将其绘制为 "current" 数字。
预期输出是 KPI 可视化:
- 显示按年(或按月,如果我的切片器是这样设置的!)求和的绝对销售额!)
- 使用从计划数据中检索到的
Target goals
- 具有基于前几年的趋势(不包括在我的样本数据中)
我该如何实现?
我的做法:
向 real
和 targets
表中添加一个计算列:
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 都可以加入。
我会推荐什么:
- 拥有table你的真实数据
- 有一个 table 的 plan/target 数据,使用月份的最后一天就可以了
- 不要将这两个事实 table 直接联系在一起
- 相反,有一个单独的日期查找 table,两个 table 都加入其中。此日期维度至少应包含月份和年份列(例如 2017 年 3 月)。
- 将两个事实 table 加入你的约会 table
- 隐藏您的 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 查询即可。
我有两个主要数据集:
包含所有销售交易的真实数据。
例如
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 可视化:实际数据与计划的对比情况。但是,我无法弄清楚如何将这两个数据集关联起来,因为它们无法真正结合在一起。
在 PowerBI 中执行此操作的惯用方法是什么?
我试过:
- 为每个来源添加一列及其各自的状态(
"real"
对比"plan"
) - 创建联合(即 "Append Queries as New")
- 添加一列
Month = MONTH([Date])
给我这个数据:
但这很奇怪,因为这样 KPI 可视化将包括 "Plan" 数据,或者在开始时或更糟的是在结束时将其绘制为 "current" 数字。
预期输出是 KPI 可视化:
- 显示按年(或按月,如果我的切片器是这样设置的!)求和的绝对销售额!)
- 使用从计划数据中检索到的
Target goals
- 具有基于前几年的趋势(不包括在我的样本数据中)
我该如何实现?
我的做法:
向
real
和targets
表中添加一个计算列:
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 都可以加入。
我会推荐什么:
- 拥有table你的真实数据
- 有一个 table 的 plan/target 数据,使用月份的最后一天就可以了
- 不要将这两个事实 table 直接联系在一起
- 相反,有一个单独的日期查找 table,两个 table 都加入其中。此日期维度至少应包含月份和年份列(例如 2017 年 3 月)。
- 将两个事实 table 加入你的约会 table
- 隐藏您的 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 查询即可。