在 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"
我有以下两个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
的查询中,您可以将示例代码应用于发票 tablelet 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"