根据月度目标计算每日目标 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.合并后,展开SalespersonMonthlyTarget列。

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 已准备就绪: