Dax 计算与 power bi 数据分析中的逻辑

Dax Calculation with logic in power bi data analytics

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

根据以上数据,我正在添加自定义列以计算第 1 号中的确切消耗量(加仑)。天。喜欢:

现在,我必须为 2016 年各个 Meter ID 的消耗绘制月明智的条形图。但这里的问题是,我必须通过将 2016 年每个月的天数除以计算每个月的消耗量,然后我才能每月绘制它们,如: y轴=每个月的消费 x 轴 = Jan Feb March Apr May Jun Jul Aug Sep Oct Nov Dec

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

但是如何为这些计算添加 measure/custom column/new table?

谢谢

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

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

您想在将数据加载到数据模型之前执行这些步骤(即在源系统中,或者在使用查询 Editor/Power 查询加载数据时)。

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

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

计算每天的消耗量

这是最简单的步骤,因为您已经计算了消耗量和天数。把一个除以另一个。在查询编辑器中,您可以单击 Consumption (gallons) 列和 select Add Column > Standard > 。在 下,选择 在列中使用值 ,然后选择 select 天数列。

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

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

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

接下来,添加列 > 自定义列 并从上一行中提取阅读日期。现在将新列命名为 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 行

此时,您应该有一个 Meter ID、Start Date、End Date 和 per day consumption 列来反映您的预期(即 per day consumption 在日期范围内是正确的)。

最后一步是为日期范围内的每个日期复制每一行。此线程 (https://community.powerbi.com/t5/Desktop/Convert-date-ranges-into-list-of-dates/td-p/129418), but personally, I recommend the technique (and video) posted by MarcelBeug (https://youtu.be/QSXzhb-EwHM) 中概述了几种解决方案。

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

终于

现在每个计量和日期都有一行,并且已经计算了每天的消耗量,您可以构建一个视觉对象。例如,您可以在轴上使用 日期 并以 每日消耗量 作为值来制作柱形图。默认情况下,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. Catching Errors in Power Query
  5. Converting a date range into a list of dates(Marcel Beug 的解决方案)