根据月度目标计算每日目标 Sales Power bi
Calculate daily targets based on monthly targets Sales Power bi
我有以下问题,但我无法全神贯注地以一种巧妙的方式解决它。
我想创建一个包含三条线的折线图。我们称之为预算蛇。
- 已创建销售订单(黑色)
- 开票订单(绿色)
- 每日目标(红色)
每个销售人员。为已创建和已开票的订单创建此图很容易,因为这些都是按日粒度计算的,因此创建折线图很容易。
我只是纠结如何以create/generate这样的一行为对象。
在这种情况下,我手动创建了一个 table with date - salesperson - daily target
例如
这很麻烦。我想做的是
为每个销售人员每月创建一个 table
PowerBI 可以 "generate/calculate" 每日目标以这样的方式
我可以绘制红线而无需创建它的所有麻烦
每个销售人员手动。
输入应该是这样的
+-----------+----------+--------------+--------+----------------+--------------+---------------+
| Date | Month | Salesperson | Branch | Monthly Target | Daily Target | Business days |
+-----------+----------+--------------+--------+----------------+--------------+---------------+
| 1/01/2017 | January | salesperson1 | test | 73529 | 4325 | 17 |
| 1/02/2017 | February | salesperson1 | test | 73529 | 4325 | 20 |
+-----------+----------+--------------+--------+----------------+--------------+---------------+
我有一个日期维度 table 所以在我的图表上我有日期作为 x 轴然后 runningorders/runningsales 作为 y 轴但我想要一个每日运行目标所以红线与订单和销售情况一致。
我看过这个模式,但我就是想不通它是如何生成的
折线图。
https://www.daxpatterns.com/budget-patterns/
所以不知何故,我想我需要一些东西来生成第一个 table 和第二个 table 作为输入。我在 Dax 中尝试了一些措施,但其中 none 为我提供了每天的累积步数。它主要只是向我展示了价值。
这些是我用于其他线路的措施。这在更改日期过滤器时效果很好。
运行 销售额
RunningTotalSales = CALCULATE(sum(vw_invoice_trn_summary[NetInvoiceValue]),
FILTER(ALLSELECTED(DimTime),DimTime[Date] <= MAX(DimTime[Date])))
运行 订单
RunningTotalOrders = CALCULATE(sum(vw_orders_raised[OrderTotal]),FILTER(ALLSELECTED(DimTime),DimTime[Date] <= MAX(DimTime[Date])))
在我当前的手动解决方案中,虽然全年不能很好地与目标行配合,因为我不确定我是否做对了。
更新
所以进一步考虑这个。感觉我只需要能够创建一个带有日期 - 每日目标 - 销售人员的 table。基于月度目标,但不确定如何在 power bi 中做到这一点。理想情况下,您可以 add/remove 一个销售人员,然后重新生成特定的 table。
对此我有两个解决方案。一位使用 DAX,一位使用查询编辑器。
DAX 解决方案:
1. 创建一个包含您需要的所有日期的日历table。
如果 Targets
是包含您每月目标的 table,请使用如下公式创建一个新的 table:
Calendar = CALENDAR(EOMONTH(MIN(Targets[Date]),-1)+1,EOMONTH(MAX(Targets[Date]),0))
2. 创建一个新的 table DailyTargets
作为您的日期和销售人员的交叉联接。
CROSSJOIN
函数为每个日期和销售人员组合创建一行:
DailyTargets = CROSSJOIN(VALUES('Calendar'[Date]),VALUES(Targets[Salesperson]))
3. 为您的每日目标创建计算列。
我通过查找每月目标并除以该月的天数来做到这一点:
DailyTarget = DIVIDE(
LOOKUPVALUE(Targets[MonthlyTarget],
Targets[Month], FORMAT(DailyTargets[Date],"mmmm"),
Targets[Salesperson], DailyTargets[Salesperson]),
DAY(EOMONTH(DailyTargets[Date],0)))
现在您有每个日期和每个销售人员的每日目标。
PowerQuery 解决方案:
1. 创建一个包含您需要的所有日期的日历table。
创建一个空白查询并使用以下代码:
= List.Dates(List.Min(Targets[Date]),
Duration.Days(Date.EndOfMonth(List.Max(Targets[Date]))
- List.Min(Targets[Date])) + 1,
#duration(1,0,0,0))
2. 将此列表转换为 table.
单击“转换”选项卡下的 "To Table" 并将列从 "Column1" 重命名为 "Date"。
3. 为月份名称创建自定义列。
您可以为此使用公式Date.MonthName([Date])
。
4. 将此查询与 Targets
table 合并(加入 Month
列)。
5.合并后,展开Salesperson
和MonthlyTarget
列。
6. 通过将每月目标除以当月的天数来创建每日目标。
您可以为此使用公式 [MonthlyTarget]/Date.DaysInMonth([Date])
。
整个查询应如下所示:
let
Source = List.Dates(List.Min(Targets[Date]), Duration.Days(Date.EndOfMonth(List.Max(Targets[Date])) - List.Min(Targets[Date])) + 1, #duration(1,0,0,0)),
#"Converted to Table" = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"Renamed Columns" = Table.RenameColumns(#"Converted to Table",{{"Column1", "Date"}}),
#"Added Custom" = Table.AddColumn(#"Renamed Columns", "Month", each Date.MonthName([Date])),
#"Merged Queries" = Table.NestedJoin(#"Added Custom",{"Month"},Targets,{"Month"},"Targets",JoinKind.LeftOuter),
#"Expanded Targets" = Table.ExpandTableColumn(#"Merged Queries", "Targets", {"Salesperson", "MonthlyTarget"}, {"Salesperson", "MonthlyTarget"}),
#"Added Custom1" = Table.AddColumn(#"Expanded Targets", "DailyTarget", each [MonthlyTarget]/Date.DaysInMonth([Date]))
in
#"Added Custom1"
如果您愿意,可以直接将其粘贴到高级编辑器中,而不是一步一步来。 (只要确保您使用任何 table 名称而不是 Targets
。)
我有一个更简单的解决方案:
I just need to be able to create a table with a date - daily target - salesperson. based on the monthly targets
假设我有这样一个 table:
其中 Month
包含每个月第一天的日期。然后,我们使用查询编辑器菜单 (Add Column > Custom Column)
添加自定义列 "Date"。我们为新列粘贴此公式:
= List.Dates([Month], Date.Day(Date.EndOfMonth([Month])), #duration(1, 0, 0, 0))
新列的每一行都将包含该行月份内所有日期的列表。通过单击右上角的按钮并选择 "Expand to new rows".
展开该列
现在每一天都有一行,您可以简单地添加另一个自定义列,"Daily Target",将每月目标除以每个月的天数:
= [Monthly Target]/Date.DaysInMonth([Date])
您的 table 已准备就绪:
我有以下问题,但我无法全神贯注地以一种巧妙的方式解决它。
我想创建一个包含三条线的折线图。我们称之为预算蛇。
- 已创建销售订单(黑色)
- 开票订单(绿色)
- 每日目标(红色)
每个销售人员。为已创建和已开票的订单创建此图很容易,因为这些都是按日粒度计算的,因此创建折线图很容易。
我只是纠结如何以create/generate这样的一行为对象。 在这种情况下,我手动创建了一个 table with date - salesperson - daily target 例如
这很麻烦。我想做的是 为每个销售人员每月创建一个 table PowerBI 可以 "generate/calculate" 每日目标以这样的方式 我可以绘制红线而无需创建它的所有麻烦 每个销售人员手动。
输入应该是这样的
+-----------+----------+--------------+--------+----------------+--------------+---------------+
| Date | Month | Salesperson | Branch | Monthly Target | Daily Target | Business days |
+-----------+----------+--------------+--------+----------------+--------------+---------------+
| 1/01/2017 | January | salesperson1 | test | 73529 | 4325 | 17 |
| 1/02/2017 | February | salesperson1 | test | 73529 | 4325 | 20 |
+-----------+----------+--------------+--------+----------------+--------------+---------------+
我有一个日期维度 table 所以在我的图表上我有日期作为 x 轴然后 runningorders/runningsales 作为 y 轴但我想要一个每日运行目标所以红线与订单和销售情况一致。
我看过这个模式,但我就是想不通它是如何生成的 折线图。
https://www.daxpatterns.com/budget-patterns/
所以不知何故,我想我需要一些东西来生成第一个 table 和第二个 table 作为输入。我在 Dax 中尝试了一些措施,但其中 none 为我提供了每天的累积步数。它主要只是向我展示了价值。
这些是我用于其他线路的措施。这在更改日期过滤器时效果很好。 运行 销售额
RunningTotalSales = CALCULATE(sum(vw_invoice_trn_summary[NetInvoiceValue]),
FILTER(ALLSELECTED(DimTime),DimTime[Date] <= MAX(DimTime[Date])))
运行 订单
RunningTotalOrders = CALCULATE(sum(vw_orders_raised[OrderTotal]),FILTER(ALLSELECTED(DimTime),DimTime[Date] <= MAX(DimTime[Date])))
在我当前的手动解决方案中,虽然全年不能很好地与目标行配合,因为我不确定我是否做对了。
更新
所以进一步考虑这个。感觉我只需要能够创建一个带有日期 - 每日目标 - 销售人员的 table。基于月度目标,但不确定如何在 power bi 中做到这一点。理想情况下,您可以 add/remove 一个销售人员,然后重新生成特定的 table。
对此我有两个解决方案。一位使用 DAX,一位使用查询编辑器。
DAX 解决方案:
1. 创建一个包含您需要的所有日期的日历table。
如果 Targets
是包含您每月目标的 table,请使用如下公式创建一个新的 table:
Calendar = CALENDAR(EOMONTH(MIN(Targets[Date]),-1)+1,EOMONTH(MAX(Targets[Date]),0))
2. 创建一个新的 table DailyTargets
作为您的日期和销售人员的交叉联接。
CROSSJOIN
函数为每个日期和销售人员组合创建一行:
DailyTargets = CROSSJOIN(VALUES('Calendar'[Date]),VALUES(Targets[Salesperson]))
3. 为您的每日目标创建计算列。
我通过查找每月目标并除以该月的天数来做到这一点:
DailyTarget = DIVIDE(
LOOKUPVALUE(Targets[MonthlyTarget],
Targets[Month], FORMAT(DailyTargets[Date],"mmmm"),
Targets[Salesperson], DailyTargets[Salesperson]),
DAY(EOMONTH(DailyTargets[Date],0)))
现在您有每个日期和每个销售人员的每日目标。
PowerQuery 解决方案:
1. 创建一个包含您需要的所有日期的日历table。
创建一个空白查询并使用以下代码:
= List.Dates(List.Min(Targets[Date]),
Duration.Days(Date.EndOfMonth(List.Max(Targets[Date]))
- List.Min(Targets[Date])) + 1,
#duration(1,0,0,0))
2. 将此列表转换为 table.
单击“转换”选项卡下的 "To Table" 并将列从 "Column1" 重命名为 "Date"。
3. 为月份名称创建自定义列。
您可以为此使用公式Date.MonthName([Date])
。
4. 将此查询与 Targets
table 合并(加入 Month
列)。
5.合并后,展开Salesperson
和MonthlyTarget
列。
6. 通过将每月目标除以当月的天数来创建每日目标。
您可以为此使用公式 [MonthlyTarget]/Date.DaysInMonth([Date])
。
整个查询应如下所示:
let
Source = List.Dates(List.Min(Targets[Date]), Duration.Days(Date.EndOfMonth(List.Max(Targets[Date])) - List.Min(Targets[Date])) + 1, #duration(1,0,0,0)),
#"Converted to Table" = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"Renamed Columns" = Table.RenameColumns(#"Converted to Table",{{"Column1", "Date"}}),
#"Added Custom" = Table.AddColumn(#"Renamed Columns", "Month", each Date.MonthName([Date])),
#"Merged Queries" = Table.NestedJoin(#"Added Custom",{"Month"},Targets,{"Month"},"Targets",JoinKind.LeftOuter),
#"Expanded Targets" = Table.ExpandTableColumn(#"Merged Queries", "Targets", {"Salesperson", "MonthlyTarget"}, {"Salesperson", "MonthlyTarget"}),
#"Added Custom1" = Table.AddColumn(#"Expanded Targets", "DailyTarget", each [MonthlyTarget]/Date.DaysInMonth([Date]))
in
#"Added Custom1"
如果您愿意,可以直接将其粘贴到高级编辑器中,而不是一步一步来。 (只要确保您使用任何 table 名称而不是 Targets
。)
我有一个更简单的解决方案:
I just need to be able to create a table with a date - daily target - salesperson. based on the monthly targets
假设我有这样一个 table:
其中 Month
包含每个月第一天的日期。然后,我们使用查询编辑器菜单 (Add Column > Custom Column)
添加自定义列 "Date"。我们为新列粘贴此公式:
= List.Dates([Month], Date.Day(Date.EndOfMonth([Month])), #duration(1, 0, 0, 0))
新列的每一行都将包含该行月份内所有日期的列表。通过单击右上角的按钮并选择 "Expand to new rows".
展开该列现在每一天都有一行,您可以简单地添加另一个自定义列,"Daily Target",将每月目标除以每个月的天数:
= [Monthly Target]/Date.DaysInMonth([Date])
您的 table 已准备就绪: