DAX 衡量从总天数计算不同年份的损失天数

DAX Measure to calculate number of lost days in different year from total number of days

我正在尝试根据我创建的日历 table 计算特定年份的天数。

例如:我有 3 列。
此事件开始的事件、天数和日期

Event       DaysLost
Injury       30              25/12/2016  
Injury       588            06/08/2012

2016 年天数 - 6
2017 年天数 - 24

第二种情况:

2012 年天数 - 146
2013 年天数 - 365
2014 年的天数 - 77

现在对于上述情况,2016 年只需要计算 6 天,其余天数应自动计算在 2017 年。但我不知道该怎么做。

在我的输出中,我想将年份放在一列中,并将年份中丢失的天数放在该特定年份的前面。

我有一个日历 table,我想要填充特定年份的天数总和。

我尝试通过获取结束日期来计算它,方法是将天数添加到第一个开始日期,然后如果天数多于该年的剩余天数。从总天数中减去剩余天数,剩余天数应移至下一年。但是我想不出如果天数持续多年并在单词后列出它们,如何继续为下一年增加天数。

2017 年 9 月 4 日 请参阅下面的 excel 解决方案

Excel solution of the problem

这是一种基于 Power Query 的方法...

我从这个开始:

然后我通过单击“添加列”选项卡和“自定义列”按钮并完成弹出窗口 window 添加了一个自定义列,如下所示:

...然后单击“确定”。

然后我更改了该新列的类型,方法是选择它,然后单击“转换”选项卡,然后单击“数据类型”和“日期”。

然后我添加了另一个自定义列,完成弹出窗口如下:

然后我添加了另一个自定义列,完成弹出窗口如下:

然后我添加了另一个自定义列,完成弹出窗口如下:

然后我通过单击列顶部的 并展开到新行来展开我添加的最后一列。

然后我添加了最后一个自定义列,完成弹出窗口如下:

最后,我按 Event、DaysLost、Started 和 Year 列分组,并通过单击“转换”选项卡和“分组依据”按钮并完成弹出窗口来对 DaysLostForYear 列求和,如下所示:

我最终得到这个:

您可能想要不同的分组,但这应该会让您接近。它显示了与每次受伤总损失天数相关的年份中损失了多少天。例如,第一次受伤持续 30 天,开始于 12/25/2016:其中 7 天发生在 2016 年,23 天发生在 2017 年。第二次受伤持续 588 天,开始于 8/6/2012:148 2012年天数,2013年365天,2014年75天

请注意,我将开始日期计为丢失的一天。 另请注意,我考虑了闰年。

希望对您有所帮助。

查询代码如下:

let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Event", type text}, {"DaysLost", Int64.Type}, {"Started", type date}}),
#"Added Custom" = Table.AddColumn(#"Changed Type", "Ended", each Date.AddDays([Started],[DaysLost]-1)),
#"Changed Type1" = Table.TransformColumnTypes(#"Added Custom",{{"Ended", type date}}),
#"Added Custom3" = Table.AddColumn(#"Changed Type1", "DaysYearStarted", each Number.From(Date.From(Text.From(Date.Year([Started]))&"/12/31")-[Started])+1),
#"Added Custom4" = Table.AddColumn(#"Added Custom3", "DaysYearEnded", each Number.From([Ended]-Date.From(Text.From(Date.Year([Ended])-1)&"/12/31"))),
#"Added Custom5" = Table.AddColumn(#"Added Custom4", "Year", each List.Numbers(Date.Year([Started]),Date.Year([Ended])-Date.Year([Started])+1)),
#"Expanded Custom" = Table.ExpandListColumn(#"Added Custom5", "Year"),
#"Added Custom1" = Table.AddColumn(#"Expanded Custom", "DaysLostForYear", each if [Year]=Date.Year([Started]) then [DaysYearStarted] else
 if [Year]=Date.Year([Ended]) then [DaysYearEnded] else
 if Date.IsLeapYear([Year]) then 366 else 365),
#"Grouped Rows" = Table.Group(#"Added Custom1", {"Event", "DaysLost", "Started", "Year"}, {{"DaysLostForYear", each List.Sum([DaysLostForYear]), type number}})
in
#"Grouped Rows"

0) 将 Excel 屏幕截图中的数据导入 Power BI 结果。

1) 在其中创建一个新列 table 使用以下公式作为结束日期(以帮助将来的公式)。

EndDate = Injuries[First Start Date] + Injuries[Days]

你说你有一个日历table,所以你可以跳到第 3 步

2) 通过单击建模 -> 新建 Table 并输入以下公式来创建新的 table。这给出了一个包含年份列表的列 table。

Years = GENERATESERIES(2000, 2020, 1)

3) 使用以下公式创建另一个新的 table。这给出了一个 table,其中初始数据 table 中的所有字段都与刚创建的年份 table 交叉连接。该公式还将生成的 table 筛选为仅 return 行,其中 Year 列中的值介于 First Start Date 和 First Start Date 加上 Days 之间。要了解有关 CROSSJOIN 函数的更多信息,请查看文档 here.

InjuriesByYear = FILTER(
    CROSSJOIN(Years, Injuries),
    Years[Year] >= Injuries[First Start Date].[Year] &&
    Years[Year] <= Injuries[EndDate].[Year]
)

4) 创建从 InjuriesByYear table 到初始数据 table 和 Year table 的关系。这将有助于促进更好的报告工作。

5) 在 InjuriesByYear table 中,通过单击建模 -> 新列并输入以下公式来创建一个新列。第一个 IF 检查是否所有丢失的天数都在一年内。第二个 IF 处理日期分布在多个年份的情况,True 子句处理第一年,False 子句处理所有其他年份。

DayPerYear = IF(
    InjuriesByYear[Year] = InjuriesByYear[First Start Date].[Year] && InjuriesByYear[Year] = InjuriesByYear[EndDate].[Year], InjuriesByYear[Days],
    IF(
        InjuriesByYear[Year] = InjuriesByYear[First Start Date].[Year], DATEDIFF(InjuriesByYear[First Start Date], DATE(InjuriesByYear[First Start Date].[Year], 12, 31), DAY),
        DATEDIFF(DATE(InjuriesByYear[Year], 1, 1), MIN(InjuriesByYear[EndDate], DATE(InjuriesByYear[Year], 12, 31)), DAY) + 1
    )
)

6) 要全面测试,请创建一个枢轴 table,如下所示。按照这些步骤,枢轴 table 应该与您的 Excel 解决方案匹配。