Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 电源查询倾斜数据_Excel_Powerbi_Powerquery - Fatal编程技术网

Excel 电源查询倾斜数据

Excel 电源查询倾斜数据,excel,powerbi,powerquery,Excel,Powerbi,Powerquery,我在power query中遇到了一个问题,我的数据来自一个分为多个页面的报表,其中一些页面将数据倾斜到不同的列。我认为可能有一个基于错误的解决方案,但我希望它更冗余,而不是依赖于文本和数字错误更正。主要是因为有时数据在某些情况下可能是字母,在另一些情况下可能是数字。我准备了一个数据集,随机生成名称和代码的替换项。我还必须对数据进行一些修改,以给出不同班次的示例,并解释从不同页面分割的记录 数据集中有12条记录,最终每个记录包含一行。 第一页是从源文档中剥离的原始数据。这些是检查历史记录(屏蔽

我在power query中遇到了一个问题,我的数据来自一个分为多个页面的报表,其中一些页面将数据倾斜到不同的列。我认为可能有一个基于错误的解决方案,但我希望它更冗余,而不是依赖于文本和数字错误更正。主要是因为有时数据在某些情况下可能是字母,在另一些情况下可能是数字。我准备了一个数据集,随机生成名称和代码的替换项。我还必须对数据进行一些修改,以给出不同班次的示例,并解释从不同页面分割的记录

数据集中有12条记录,最终每个记录包含一行。 第一页是从源文档中剥离的原始数据。这些是检查历史记录(屏蔽),每个记录需要移动到一行,并为四个特定区域分别设置列:

[姓名、日期、支票号码等][收入][扣除额][税费]

记录信息,包括姓名、日期、记录ID号和金额,是从原始数据中提取和格式化的第一件事。我在NameData和CheckData中应用的步骤将显示这些记录是如何提取和格式化的,并且本节中的一些扭曲数据很容易与合并函数和条件列协调

每个单独的付款项目(收入代码、扣减代码或税代码)都会格式化,然后旋转到其自己的列。您可以在收益查询中看到此操作的示例。PayItemReference查询是一些基本过滤器,我将其用作支付项目的起点。您可以在该查询中看到,代码将从一列移动到另一列,文本和数字混合在一起。代码和它们的值之间可以有空格,也可以没有空格,也可以完全移动列


我正在将代码及其值合并到常规列,然后我可以合并、取消pivot、pivot等以获得最终格式。我尝试过使用条件列和错误,但在原始数据集上,这两种方法都存在一些小问题。我只是需要一些新的眼光和新的方法来处理数据

这是一项具有挑战性的任务

首先,最好将表拆分回页面,因为每个页面的列结构可能是唯一的。因此,我形成了一个表格列表,每个表格一页。然后我必须处理每一页:提取列名,为每一行添加摘要信息,过滤不需要的行,并设置列名。使用自定义函数
ConvertTable
对列表中的每个表执行此操作。之后,您只需合并结果表

在这里:

let
Source=Excel.CurrentWorkbook(){[Name=“Table1”]}[Content],
AddRowNum=Table.AddColumn(Table.AddIndexColumn(源,“索引”,1,1),“RowNum”,每个数字.Mod([Index]-1,52)+1,类型号),
CountTables={1..(Number.RoundUp(Table.RowCount(AddRowNum)/52,0)),
ListTables=List.Transform(CountTables,(ListItem)=>Table.SelectRows(AddRowNum,每个[Index]>52*(ListItem-1)和[Index]
让
hdr1=Table.Transpose(Table.FillDown(Table.Transpose(Table.FromRecords({tbl{6}})),{“Column1})),
hdr2=Table.FromRecords({tbl{7}}),
ColNames=Table.Transpose(Table.SelectColumns(Table.FirstN(Table.AddColumn)(Table.Transpose(Table.Combine({hdr1,hdr2})),“ColumnName”,每个[Column1]&::“&[Column2]),19),{“ColumnName}),
AddPayDate=Table.AddColumn(tbl,“Pay Date”,如果[RowNum]>8和Text.Trim(tbl{[RowNum]-2}[Column9])=“Pay Date”,则[Column9]为空,键入日期),
AddPeriodEndDate=Table.AddColumn(AddPayDate,“期间结束日期”,如果[RowNum]>8,则分别为[RowNum]>8和Text.Trim(tbl{[RowNum]-2}[Column12])=“期间结束日期”,然后[Column12]否则为空,键入日期),
AddJobCode=Table.AddColumn(AddPeriodEndDate,“Job Code”,如果[RowNum]>8和Text.Trim(tbl{[RowNum]-2}[Column14])=“Job Code”,则[Column14]为null,Int64.Type),
AddCheckInfo=Table.AddColumn(AddJobCode,“Check Info”,如果[RowNum]>8和Text.Trim([Column1])=“检查是否打印:”然后检查Table.Transpose(Table.SelectRows(Table.Transpose(Table.FromRecords({})),每个[Column1]null),否则为null),
ExpandedCheckInfo=Table.ExpandTableColumn(AddCheckInfo,“支票信息”,{“Column4”,“Column6”,“Column8”},{“支票金额”,“直接存款”,“净额”}),
FillUp=Table.FillUp(ExpandedCheckInfo,{“Column3”,“支票金额”,“直接存款”,“净额”})//Table.AddColumn(AddJobCode,“tmp2”,如果[RowNum]<9,则每个“else”(如果Text.Trim([Column1])=“Check Printed:”然后(如果[Column3]=null,则-1 else[Column3])else null),键入Text),{“tmp2),
FillDown=Table.FillDown(FillUp,{“Column1”、“Column5”、“支付日期”、“期间结束日期”、“职务代码”}),
AddCheckeedFixed=Table.AddColumn(填写“Check:EEID.fixed”,每个Text.From([Column5])&“&Text.From([Column3]),键入Text),
FilterDextraRows=Table.SelectRows(AddCheckEEIDfixed,每个[RowNum]>8和Text.Trim([Column1])“选中打印:”和Text.Trim([Column7])“PerControl”和Text.Trim(tbl{[RowNum]-2}[Column7])“PerControl”和[#“Check EEID.fixed”]null),
DemotedHeaders=表.DemoteHeaders(FilteredExtraRows),
GetColumnNames1=Table.Combine({Table.FromRecords({DemodedHeaders{0}}),ColNames}),
GetColumnNames2=Table.PromoteHeaders(Table.FillDown(GetColumnNames1,Table.ColumnNames(GetColumnNames1)),
SetColumnNames=Table.PromoteHeaders(Table.Combine({GetColumnNames2,FilteredExtraRows}))
在里面
设置列名称,
ConvertedList=List.Transform(ListTables,(t)=>ConvertTable(t)),
GetWholeTable=Table.Combine(ConvertedList)
在里面
可获取的

您需要详细解释数据的外观以及如何将其拆分为列。在您的示例中,我看不到任何移位,因为所有行都有7个位置。此外,对于数字,可能会
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    AddRowNum = Table.AddColumn(Table.AddIndexColumn(Source, "Index", 1, 1), "RowNum", each Number.Mod([Index]-1, 52)+1, type number),
    CountTables = {1..(Number.RoundUp(Table.RowCount(AddRowNum)/52, 0))},
    ListTables = List.Transform(CountTables, (ListItem)=>Table.SelectRows(AddRowNum, each [Index] > 52 * (ListItem - 1) and [Index] <= 52 * ListItem)),

    ConvertTable = (tbl as table) as table =>
    let
        hdr1 = Table.Transpose(Table.FillDown(Table.Transpose(Table.FromRecords({tbl{6}})), {"Column1"})),
        hdr2 = Table.FromRecords({tbl{7}}),
        ColNames = Table.Transpose(Table.SelectColumns(Table.FirstN(Table.AddColumn(Table.Transpose(Table.Combine({hdr1, hdr2})), "ColumnName", each [Column1] & ": " & [Column2]), 19), {"ColumnName"})),
        AddPayDate = Table.AddColumn(tbl, "Pay Date", each if [RowNum] > 8 and Text.Trim(tbl{[RowNum]-2}[Column9]) = "Pay Date" then [Column9] else null, type date),
        AddPeriodEndDate = Table.AddColumn(AddPayDate, "Period End Date", each if [RowNum] > 8 and Text.Trim(tbl{[RowNum]-2}[Column12]) = "Period End Date" then [Column12] else null, type date),
        AddJobCode = Table.AddColumn(AddPeriodEndDate, "Job Code", each if [RowNum] > 8 and Text.Trim(tbl{[RowNum]-2}[Column14]) = "Job Code" then [Column14] else null, Int64.Type),
        AddCheckInfo = Table.AddColumn(AddJobCode, "Check Info", each if [RowNum] > 8 and Text.Trim([Column1]) = "Check Printed:" then Table.Transpose(Table.SelectRows(Table.Transpose(Table.FromRecords({_})), each [Column1] <> null)) else null),
        ExpandedCheckInfo = Table.ExpandTableColumn(AddCheckInfo, "Check Info", {"Column4", "Column6", "Column8"}, {"Check Amount", "Direct Deposit", "Net"}),
        FillUp = Table.FillUp(ExpandedCheckInfo, {"Column3", "Check Amount", "Direct Deposit", "Net"})//Table.AddColumn(AddJobCode, "tmp2", each if [RowNum] < 9 then "" else (if Text.Trim([Column1]) = "Check Printed:" then (if [Column3] = null then -1 else [Column3]) else null), type text), {"tmp2"}),
        FillDown = Table.FillDown(FillUp, {"Column1", "Column5", "Pay Date", "Period End Date", "Job Code"}),
        AddCheckEEIDfixed = Table.AddColumn(FillDown, "Check:EEID.fixed", each Text.From([Column5]) & ":" & Text.From([Column3]), type text),
        FilteredExtraRows = Table.SelectRows(AddCheckEEIDfixed, each [RowNum] > 8 and Text.Trim([Column1]) <> "Check Printed:" and Text.Trim([Column7]) <> "PerControl" and Text.Trim(tbl{[RowNum]-2}[Column7]) <> "PerControl" and [#"Check:EEID.fixed"] <> null),
        DemotedHeaders = Table.DemoteHeaders(FilteredExtraRows),
        GetColumnNames1 = Table.Combine({Table.FromRecords({DemotedHeaders{0}}), ColNames}),
        GetColumnNames2 = Table.PromoteHeaders(Table.FillDown(GetColumnNames1, Table.ColumnNames(GetColumnNames1))),
        SetColumnNames = Table.PromoteHeaders(Table.Combine({GetColumnNames2, FilteredExtraRows}))
    in
        SetColumnNames,

    ConvertedList = List.Transform(ListTables, (t) => ConvertTable(t)),
    GetWholeTable = Table.Combine(ConvertedList)
in
    GetWholeTable