Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 在Power Query中使用多个维度按日期填写缺少的累积值_Excel_Powerquery_M - Fatal编程技术网

Excel 在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.

在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. 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函数中的值来设置其他值)
  • 然后展开子表并设置类型
M代码

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)然后_
//创建子表,以填充缺少的周数
//并为缺失的周数创建记录,从而将标准延续
//计数为“空”。
//如果你想让计数为零,就改变它