根据每月目标计算每日目标Sales Power bi

时间:2018-01-26 19:57:28

标签: sql-server ssas powerbi dax powerquery

我有以下问题,我只能用它来包围它以便以一种干净的方式做到这一点。

我想创建一个包含三行的折线图。我们称之为预算蛇。

enter image description here

  • 创建销售订单(黑色)
  • 已开票订单(绿色)
  • 每日目标(红色)

这是每个销售人员。为创建和开票订单创建此图表非常简单,因为这些都是按日常粒度设置的,因此创建折线图很容易。

我正在努力为目标创建/生成这样一条线。 在这种情况下,我手动创建了一个包含date - salesperson - 每日目标的表 例如

enter image description here

这非常麻烦。我希望能做的是 为每个销售人员创建一个月度级别的表格 PowerBI可以生成/计算"这样的每日目标 我可以绘制红线图,而不必为此创建麻烦 每个销售人员手动。

输入将是这样的

+-----------+----------+--------------+--------+----------------+--------------+---------------+
|   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 |
+-----------+----------+--------------+--------+----------------+--------------+---------------+

我有一个日期维度表,所以在我的图表上,我将日期作为x轴,然后将runningorders / runningsales作为y轴,但我会像每日运行目标一样,以便红线很好地与订单和销售。

我看过这个模式,但我无法弄清楚它是如何产生的 线图。

https://www.daxpatterns.com/budget-patterns/

所以不知何故,我想我需要一些能够生成第一个表并将第二个表作为输入的东西。我在Dax尝试了一些措施,但没有一个给我每天的累积步骤。它主要是告诉我价值。

这些是我用于其他行的措施。这在更改日期过滤器时很有效。 运行销售

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

在我目前的手动解决方案中,整年虽然与目标行无效,但我不确定我是否正确。

enter image description here

更新

进一步思考这个问题。感觉就像我只需要能够创建一个带日期的表 - 每日目标 - 销售人员。根据每月目标,但不知道如何在power bi中做到这一点。理想情况下,您只需添加/删除销售人员即可重新生成特定表。

2 个答案:

答案 0 :(得分:2)

我有两个解决方案。一个使用DAX,一个使用查询编辑器。

DAX解决方案:

1。创建一个包含所需日期的日历表。

如果Targets是包含每月定位的表,请使用如下公式创建新表:

Calendar = CALENDAR(EOMONTH(MIN(Targets[Date]),-1)+1,EOMONTH(MAX(Targets[Date]),0))

2。创建一个新表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。创建一个包含所需日期的日历表。

创建一个空白查询并使用以下代码:

= 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. 将此列表转换为表格。

单击“变换”选项卡下的“到表格”,并将列从“Column1”重命名为“Date”。

3. 为月份名称创建自定义列。

您可以使用公式Date.MonthName([Date])

4. 将此查询与Targets表合并(加入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"

如果您愿意,可以将其粘贴到高级编辑器中,而不是一步一步地进行。 (请确保使用您拥有的任何表名而不是Targets。)

答案 1 :(得分:0)

我有一个更简单的解决方案:

  

我只需要能够创建一个带有日期的表 - 每日目标 - 销售人员。基于每月目标

假设我有一张这样的表:

enter image description here

Month包含每月第一天的日期。然后,我们使用查询编辑器菜单(Add Column > Custom Column)添加自定义列“日期”。我们将此公式粘贴到新列中:

= List.Dates([Month], Date.Day(Date.EndOfMonth([Month])), #duration(1, 0, 0, 0))

新列的每一行都将包含该行月份内所有日期的列表。通过单击右上角的按钮并选择“展开到新行”来展开该列。

enter image description here

现在每天都有一行,您只需添加另一个自定义列“每日目标”,即将每月目标除以每月的天数:

= [Monthly Target]/Date.DaysInMonth([Date])

你的桌子准备好了:

enter image description here