在 Power Query 中将两个表与多个条件组合

Combining two tables with multiple criteria in Power Query

我有以下两个table。

Invoice Date
1 01/01/20
2 25/01/21
3 25/02/22
4 31/08/19

以及下一个:

Start Date End Date Year
01/01/00 31/07/20 1
01/08/20 31/07/21 2
01/08/21 31/07/22 3

两个 table 都在两个不同的 Excel 文件中。

我想要实现的是在第二个列中添加一个额外的列,其中的相关年份取自第一个列。 对于“相关年份”,我指的是第二个 table.

的开始日期和结束日期之间的每张发票的年份

我想要达到的结果如下:

Invoice Date Year
1 01/01/20 1
2 25/01/21 2
3 25/02/22 3
4 31/08/19 1

我知道我可以添加一个带有 M 公式的额外列来计算年份,而无需第一个 table,但这样听起来更易于维护。明年我只需在第二个 Excel table 中添加一行,第三个 table 中的年份将是正确的,而不是修改公式。

我该怎么做?

开始约会 table 1/1/1980 或类似日期,而不是 00 年

从单独的查询日期中提取数据table,添加带有公式的自定义列

{Number.From([开始日期])..Number.From([结束日期])}

并将其扩展到行并隐藏到日期。这给出了每个日期组合。左外合并到你的另一个 table

如果其他数据已加载到名为 datetable

的查询中,您可以将示例代码应用于发票 table
let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Date", type date}}),
#"Added Custom" = Table.AddColumn(datetable, "Custom", each {Number.From([Start Date])..Number.From([End Date])}),      // assume other data is in query named: datetable
#"Expanded Custom" = Table.ExpandListColumn(#"Added Custom", "Custom"),
#"DateChanged Type" = Table.TransformColumnTypes(#"Expanded Custom",{{"Custom", type date}}),
#"Merged Queries" = Table.NestedJoin(#"Changed Type", {"Date"}, #"DateChanged Type", {"Custom"}, "Table3", JoinKind.LeftOuter),
#"Expanded Table3" = Table.ExpandTableColumn(#"Merged Queries", "Table3", {"Year"}, {"Year"})
in #"Expanded Table3"

正因为,还有另一个替代版本

let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Date", type date}}),
#"Added Custom" = Table.AddColumn( #"Changed Type", "Custom", each Table.SelectRows(datetable,(x) => [Date] >= x[Start Date] and [Date] <=x[End Date])[Year]{0})
in #"Added Custom"     

只是因为...这是另一种方法:

我为此命名了你的第一个 table Table1 和你的第二个 table Table2

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Date", type date}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Start Date", each List.Max(Table.SelectRows(Table2, let dt = [Date] in each ([Start Date] < #date(Date.Year(dt), Date.Month(dt), Date.Day(dt))))[Start Date]), type date),
    #"Added Custom1" = Table.AddColumn(#"Added Custom", "End Date", each List.Min(Table.SelectRows(Table2, let dt = [Date] in each ([End Date] > #date(Date.Year(dt), Date.Month(dt), Date.Day(dt))))[End Date]), type date),
    #"Added Custom2" = Table.AddColumn(#"Added Custom1", "Year", each Table.SelectRows(Table2, let sdt = [Start Date], edt = [End Date] in each ([Start Date] = #date(Date.Year(sdt), Date.Month(sdt), Date.Day(sdt)) and [End Date] = #date(Date.Year(edt), Date.Month(edt), Date.Day(edt)))){0}[Year]),
    #"Removed Other Columns" = Table.SelectColumns(#"Added Custom2",{"Invoice", "Date", "Year"})
in
    #"Removed Other Columns"