【问题标题】:Dax Calculation with logic in power bi data analytics使用 Power Bi 数据分析中的逻辑进行 Dax 计算
【发布时间】:2017-03-23 10:59:49
【问题描述】:

在数据分析计算方面需要帮助。 目前,我获取的消费历史数据如下:

在上面的数据中,我添加了自定义列来计算精确消耗量(加仑)。天。喜欢:

现在,我必须为 2016 年各个仪表 ID 的消耗量绘制月份条形图。但这里的问题是,我必须通过将 2016 年每个月的天数除以来计算每个月的消费量,然后只有我才能像每月一样绘制它们: y轴=每月消费 x 轴 = 1 月 2 月 3 月 4 月 5 月 6 月 7 月 8 月 9 月 10 月 11 月 12 月

所以,在一月份,消耗量应该是 = 10 + 100 + ((115/38) * 7) 加仑 注意:这里,在 ((115/38) * 7) 中:我们正在计算 1 月和整个 3 月单日 7 天的平均消费量,然后得到 1 月的最后 7 天消费量,以便我们可以将其添加到总消费量的计算中一月的

但是如何为这些计算添加度量/自定义列/新表?

谢谢

【问题讨论】:

  • ((115/38) * 7) 部分中,您是否说由于我 1 月的最后一个可用日期是 24 日,所以我必须取平均每天的消费量从下一个可用月份(3 月)开始,乘以 1 月(24 日)的最后可用日期,从 1 月(31 日)的最后一天开始 = 7 天?
  • @Sid 是的,下次阅读日期不可预测。也可能是一年后,因此必须计算每天的消耗量,然后将它们绘制在图表中或根据我们的要求使用它们

标签: powerbi dax customcolumn


【解决方案1】:

你需要做的比较复杂,但我的解决方案总结是:

  1. 计算每日消耗量
  2. 计算每次阅读的开始和结束日期(例如上一次阅读日期加一天,以及阅读日期)
  3. 将数据扩展为每天 1 行,而不是每次读数 1 行

您希望在将数据加载到数据模型之前(即在源系统中,或在使用查询编辑器/Power Query 加载数据时)执行这些步骤。

下面,我假设您使用的是查询编辑器/Power Query。但是,如果您可以使用您的源系统,它通常是更好的选择(因为源系统可能是一个比您的桌面快得多的数据库)。

请注意,您的天数计算对我来说没有意义。从 2016 年 1 月 24 日到 2016 年 3 月 31 日之间有超过 38 天。在 1 月 10 日到 1 月 24 日之间也有超过 13 天。因此,很难判断您是否要在当天计算新读数之前的读数是被读取的,或者是在接下来的一整天。我假设前者。另请注意,我是在您的天数计算正确的基础上继续进行的

计算每日消耗量

这是最简单的步骤,因为您已经计算了消耗量和天数。只需将一个除以另一个。在查询编辑器中,您可以单击消耗(加仑)列并选择添加列 > 标准 > 划分。在下,选择在列中使用值,然后选择“天数”列。

计算每次阅读的开始和结束日期

读数的日期是结束日期,因此您可以将 Date 重命名为 End Date(因为读数是追溯应用的)。

对于开始日期,您需要在查询编辑器中添加一个索引列(添加列 > 索引列)。您需要确保您的数据按仪表 ID 和升序日期排序在此之前。调用列索引

接下来,添加列 > 自定义列并从前一行中提取阅读日期。现在调用新列Previous End Date

// A try is necessary because we can't get the previous row if there is no previous row (we'll get an error, which we can handle in the 'otherwise' block)
try 
  if 
    // See if the previous row is for the same Meter ID
    [Meter ID] = #"Reordered Columns"{[Index] - 1}[Meter ID] 
  then 
    // If it is, grab the Reading Date from the previous row
    #"Reordered Columns"{[Index]-1}[End Date] 
  else 
    // If this is the first reading for a meter, calculate the Start Date by subtracting the No. of Days from the End Date
    Date.AddDays([End Date], -[No. of Days])
otherwise
  // If this is the first row in the table, also calculate the Start Date by subtracting the No. of Days from the End Date
  Date.AddDays([End Date], -[No. of Days])

接下来,您需要将 1 添加到开始日期,因为我们希望读数适用于上一次读数后的第二天,而不是上一次读数的当天。

请注意,如果您希望阅读日期计入上一周期,请从结束日期减去 1,而不是在开始日期(上一个结束日期)上加 1。

将您的数据扩展为每天 1 行

此时,您应该有一个计量器 ID、开始日期、结束日期和反映您预期的每日消耗量列(即日期范围内的每日消耗量是正确的)。

最后一步是复制日期范围内每个日期的每一行。此线程 (https://community.powerbi.com/t5/Desktop/Convert-date-ranges-into-list-of-dates/td-p/129418) 中概述了几个解决方案,但我个人推荐 MarcelBeug (https://youtu.be/QSXzhb-EwHM) 发布的技术(和视频)。

您最终应该得到更像这样的东西(在删除和重命名列之后):

终于

现在您每米和日期有一行,并且已经计算了每天的消耗量,您可以构建一个视觉对象。例如,您可以制作一个柱形图,其中 Date 在轴上,Consumption per Day 作为值。默认情况下,Power BI 将识别 Date 是一个日期,并将按年-季-月-日累计。按年和季度的小“x”,你会得到一个图表,按月总结每天的消费。您还可以向下钻取到单个日期。

进一步阅读

  1. Reading a value from a previous row in Power Query
  2. If Statements in Power Query
  3. The AddDays function in Power Query
  4. Adding Comments in Power Query
  5. Catching Errors in Power Query
  6. Converting a date range into a list of dates(Marcel Beug 的解决方案)
  7. A similar problem I previously answered

【讨论】:

  • 谢谢..我会试试这个...但似乎是我需要的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多