Excel 在Power Query中使用多个维度按日期填写缺少的累积值
在Power Query中,给定一个基于日期(Excel 在Power Query中使用多个维度按日期填写缺少的累积值,excel,powerquery,m,Excel,Powerquery,M,在Power Query中,给定一个基于日期(每周开始)的累积值(累积唯一计数)的表,该表需要填写,如果该表有多个维度/属性列,如何生成缺少的行?表中的其他值列(Count和Unique Count in Week)应填写为null或0 示例表: 标准一 标准二 本周开始 计数 周内唯一计数 累积唯一计数 A. C 3/22/2020 4. 1. 1. A. C 3/29/2020 9 3. 4. A. C 4/5/2020 3. 2. 5. A. C 4/12/2020 10 8. 9 A.
每周开始
)的累积值(累积唯一计数
)的表,该表需要填写,如果该表有多个维度/属性列,如何生成缺少的行?表中的其他值列(Count
和Unique Count in Week
)应填写为null或0
示例表:
标准一
标准二
本周开始
计数
周内唯一计数
累积唯一计数
A.
C
3/22/2020
4.
1.
1.
A.
C
3/29/2020
9
3.
4.
A.
C
4/5/2020
3.
2.
5.
A.
C
4/12/2020
10
8.
9
A.
D
3/22/2020
3.
3.
3.
A.
D
4/5/2020
8.
5.
6.
A.
D
4/12/2020
2.
3.
9
B
C
3/29/2020
6.
4.
4.
B
C
4/12/2020
12
9
10
B
D
3/29/2020
8.
4.
4.
B
D
4/5/2020
6.
6.
7.
B
D
4/12/2020
9
7.
9
看看这对你有用吗 我正在创建日期和条件的所有组合,将其附加到原始表中,然后使用索引与前一行进行比较,以查看是否需要填写
let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Criteria One", type text}, {"Criteria Two", type text}, {"Start of Week", type date}, {"Count", Int64.Type}, {"Unique Count in Week", Int64.Type}, {"Cumulative Unique Count", Int64.Type}}),
// get all unique combinations of Criteria1 and Criteria2 and merge it to all combination of dates between max and min dates
#"Removed Other Columns" = Table.SelectColumns(#"Changed Type",{"Criteria One", "Criteria Two"}),
Unique_Critera = Table.Distinct(#"Removed Other Columns"),
Max= Number.From(List.Max(#"Changed Type"[Start of Week])),
Min= Number.From(List.Min(#"Changed Type"[Start of Week])),
Date_Range={ Number.From(List.Min(#"Changed Type"[Start of Week])) .. Number.From(List.Max(#"Changed Type"[Start of Week]))},
#"Added Custom" = Table.AddColumn(Unique_Critera, "Start of Week", each Date_Range),
#"Expanded Custom" = Table.ExpandListColumn(#"Added Custom", "Start of Week"),
#"Changed Type1" = Table.TransformColumnTypes(#"Expanded Custom",{{"Start of Week", type date}}),
#"Added Custom1" = Table.AddColumn(#"Changed Type1", "DayWeek", each Date.DayOfWeek([Start of Week])),
#"Filtered Rows" = Table.SelectRows(#"Added Custom1", each ([DayWeek] = 0)),
#"Removed Columns" = Table.RemoveColumns(#"Filtered Rows",{"DayWeek"}),
// remove those on list that exists alrady
#"Merged Queries" = Table.NestedJoin(#"Removed Columns",{"Criteria One", "Criteria Two", "Start of Week"},#"Changed Type",{"Criteria One", "Criteria Two", "Start of Week"},"Table2",JoinKind.LeftOuter),
#"Expanded Table2" = Table.ExpandTableColumn(#"Merged Queries", "Table2", {"Criteria One"}, {"Criteria One.1"}),
#"Filtered Rows1" = Table.SelectRows(#"Expanded Table2", each ([Criteria One.1] = null)),
#"Removed Columns1" = Table.RemoveColumns(#"Filtered Rows1",{"Criteria One.1"}),
// append that list to original and sort
#"Appended Query" = Table.Combine({#"Changed Type", #"Removed Columns1"}),
#"Sorted Rows" = Table.Sort(#"Appended Query",{{"Criteria One", Order.Ascending}, {"Criteria Two", Order.Ascending}, {"Start of Week", Order.Ascending}}),
// refer to previous row to see if we need to fill down or leave as null
#"Added Index" = Table.AddIndexColumn(#"Sorted Rows", "Index", 0, 1),
#"Added Custom2" = Table.AddColumn(#"Added Index", "Custom", each if [Cumulative Unique Count] <> null then [Cumulative Unique Count] else if #"Added Index"{[Index]-1}[Criteria One]=[Criteria One] and #"Added Index"{[Index]-1}[Criteria Two]=[Criteria Two] then #"Added Index"{[Index]-1}[Cumulative Unique Count] else null),
#"Removed Columns2" = Table.RemoveColumns(#"Added Custom2",{"Cumulative Unique Count", "Index"}),
#"Renamed Columns" = Table.RenameColumns(#"Removed Columns2",{{"Custom", "Cumulative Unique Count"}})
in #"Renamed Columns"
let Source=Excel.CurrentWorkbook(){[Name=“Table1”]}[Content],
#“更改的类型”=表.TransformColumnTypes(源,{{“条件一”,类型text},{“条件二”,类型text},{“每周开始”,类型date},{“计数”,Int64.Type},{“每周唯一计数”,Int64.Type},{“累积唯一计数”,Int64.Type}),
//获取Criteria1和Criteria2的所有唯一组合,并将其合并到最大和最小日期之间的所有日期组合
#“已删除的其他列”=表。选择列(#“已更改类型”、{“条件一”、“条件二”}),
Unique_Critera=Table.Distinct(#“已删除其他列”),
Max=Number.From(List.Max(#“已更改类型”[周初]),
Min=Number.From(List.Min(#“已更改类型”[周初]),
Date#u Range={Number.From(List.Min(#“Changed Type”[Start of Week]))…Number.From(List.Max(#“Changed Type”[Start of Week])),
#“添加的自定义”=Table.AddColumn(唯一的标准,“每周开始”,每个日期范围),
#“扩展自定义”=Table.ExpandListColumn(#“添加自定义”、“周初”),
#“Changed Type1”=Table.TransformColumnTypes(#“Expanded Custom”,{{{“Start of Week”,type date}),
#“添加的Custom1”=Table.AddColumn(#“Changed Type1”、“DayWeek”、每个Date.DayOfWeek([周初]),
#“筛选行”=表格。选择行(#“添加的自定义1”,每个([DayWeek]=0)),
#“删除的列”=Table.RemoveColumns(#“筛选的行”,{“DayWeek”}),
//删除列表中存在的所有内容
#“合并查询”=表.NestedJoin(#“已删除列”、{“条件一”、“条件二”、“周初”}、#“已更改类型”、{“条件一”、“条件二”、“周初”}、“表二”、JoinKind.LeftOuter),
#“Expanded Table2”=Table.ExpandTableColumn(#“合并查询”、“Table2”、{“条件一”}、{“条件一.1”}),
#“筛选行1”=表。选择行(#“扩展表2”,每个([Criteria One.1]=null)),
#“Removed Columns1”=表.RemoveColumns(#“Filtered Rows1”,{“Criteria One.1”}),
//将该列表附加到原始列表并排序
#“追加查询”=表.Combine({#“已更改类型”,#“已删除列1”}),
#“排序行”=表.Sort(#“追加查询”、{{“条件一”、Order.升序}、{“条件二”、Order.升序}、{“周初”、Order.升序}),
//请参阅前一行,查看是否需要填写或保留为空
#“添加的索引”=表.AddIndexColumn(#“排序行”,“索引”,0,1),
#“Added Custom2”=Table.AddColumn(#“Added Index”、“Custom”,如果[累积唯一计数]为空,则[累积唯一计数]否则如果#“Added Index”{[Index]-1}[Criteria One]=[Criteria One]和#“Added Index”{[Index]-1}[Criteria Two]=[Criteria Two]则#“Added Index”{[Index]-1}[Criteria Unique Count else为空),
#“Removed Columns 2”=Table.RemoveColumns(#“Added Custom2”、{“累计唯一计数”、“索引”}),
#“重命名列”=Table.RenameColumns(#“Removed Columns2”,{{{“Custom”,“Cumulative Unique Count”})
在#“重命名列”中
我想您也可以将原始数据合并到新表中,然后继续保存几行
- 创建所有可能的周的列表
- 按标准分组
- 为每个组创建一个子表
- 创建缺失周的列表
- 对于每个缺失的一周,创建一个记录
- 这些标准是从集团继承下来的
- 日期将根据缺少的周列表递增
- 各种计数被设置为Null(如果愿意,可以将设置为零,或者通过更改List.Generate函数中的值来设置其他值)
- 然后展开子表并设置类型
let
Source = Excel.CurrentWorkbook(){[Name="Table6"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{
{"Criteria One", type text}, {"Criteria Two", type text}, {"Start of Week", type date},
{"Count", Int64.Type}, {"Unique Count in Week", Int64.Type}, {"Cumulative Unique Count", Int64.Type}}),
//create a list of all the possible weeks
wkFirst = List.Min(#"Changed Type"[Start of Week]),
wkLast = List.Max(#"Changed Type"[Start of Week]),
numWeeks = Duration.Days(wkLast-wkFirst)/7+1,
allWeeks = List.Dates(wkFirst,numWeeks,#duration(7,0,0,0)),
//Group; then add missing weeks to each sub-table
#"Grouped Rows" = Table.Group(#"Changed Type", {"Criteria One", "Criteria Two"}, {
{"All", each _, type table [Criteria One=nullable text, Criteria Two=nullable text, Start of Week=nullable date, Count=nullable number, Unique Count in Week=nullable number, Cumulative Unique Count=nullable number]},
{"with All weeks", each if Table.RowCount(_) = List.Count(allWeeks) then _
//create the subtables whereby we fill in the missing weeks
//and create a record for the missing weeks whereby the Criteria are carried over
//and the Counts are "nulled".
//if you want to make the counts Zero, just change that within the List.Generate function
else Table.Sort(
Table.Combine({_,
let
missingWeeks = List.RemoveMatchingItems(allWeeks, [Start of Week]),
startDts = List.Generate(()=>
[Counter =0, Criteria One= [Criteria One]{0}, Criteria Two= [Criteria Two]{0}, Start of Week=missingWeeks{0}, Count=null, Unique Count in Week=null, Cumulative Unique Count=null],
each [Counter] < List.Count(missingWeeks),
each [Counter = [Counter]+1, Criteria One=[Criteria One], Criteria Two=[Criteria Two], Start of Week=missingWeeks{[Counter]+1}, Count=null, Unique Count in Week=null, Cumulative Unique Count=null])
in
//Remove the "Counter" column from the Combined subtable
//Then Sort by "Start of Week"
Table.RemoveColumns(Table.FromRecords(startDts),"Counter")}),
{"Start of Week"})
}
}),
//Remove Extra Columns, then expand the subtable, and type it
#"Removed Columns" = Table.RemoveColumns(#"Grouped Rows",{"Criteria One", "Criteria Two", "All"}),
#"Expanded with All weeks" = Table.ExpandTableColumn(#"Removed Columns", "with All weeks", {"Criteria One", "Criteria Two", "Start of Week", "Count", "Unique Count in Week", "Cumulative Unique Count"}, {"Criteria One", "Criteria Two", "Start of Week", "Count", "Unique Count in Week", "Cumulative Unique Count"}),
#"Changed Type1" = Table.TransformColumnTypes(#"Expanded with All weeks",{{"Criteria One", type text}, {"Criteria Two", type text}, {"Start of Week", type date}, {"Count", Int64.Type}, {"Unique Count in Week", Int64.Type}, {"Cumulative Unique Count", Int64.Type}})
in
#"Changed Type1"
let
Source=Excel.CurrentWorkbook(){[Name=“Table6”]}[Content],
#“更改的类型”=表.TransformColumnTypes(源、{
{“标准一”,键入text},{“标准二”,键入text},{“每周开始”,键入日期},
{“计数”,Int64.Type},{“周内唯一计数”,Int64.Type},{“累积唯一计数”,Int64.Type}),
//创建所有可能的周的列表
wkFirst=List.Min(#“已更改类型”[周初]),
wkLast=List.Max(#“已更改类型”[周初]),
numWeeks=持续时间天数(最后一周/第一周)/7+1,
allWeeks=列表日期(星期一、星期几、持续时间(7,0,0,0)),
//组;然后将缺少的周数添加到每个子表中
#“分组行”=表.Group(#“已更改类型”、{“条件一”、“条件二”}{
{“All”,每个u,键入表格[标准一=可空文本,标准二=可空文本,周初=可空日期,计数=可空数字,周内唯一计数=可空数字,累积唯一计数=可空数字],
{“with All weeks”,每个if表.RowCount({)=List.Count(allWeeks)然后_
//创建子表,以填充缺少的周数
//并为缺失的周数创建记录,从而将标准延续
//计数为“空”。
//如果你想让计数为零,就改变它