2017-02-09 74 views
1

我在電源查詢中遇到問題,其中數據來自分成多個頁面的報表,並且一些頁面將數據傾斜到不同的列。我認爲可能存在基於錯誤的解決方案,但我希望它更加多餘,不要依賴文本與數字糾錯。主要是因爲有時在某些情況下可能是字母數據的數據在其他情況下可能是數字。我準備了一個隨機生成名稱和代碼替換的數據集。我也不得不稍微屠宰這些數據,以舉例說明不同的轉變,並且解釋從不同頁面分割出來的記錄。電源查詢歪斜的數據

https://drive.google.com/file/d/0B2qUbAWJXgfyNlByV2RHODJzQjA/view?usp=sharing

有12條記錄中的數據集,最終將包含每條記錄一行。 第一頁是從源文檔中剝離的原始數據。這些是檢查歷史記錄(被屏蔽),需要被移動到每個記錄的單行,並且具有用於四個特定區域的單獨列:

[收入] [扣除] [稅收]

記錄信息包括名稱,日期,記錄ID號和金額是從原始數據中提取並格式化的第一手東西。我在NameData和CheckData中應用的步驟將顯示如何提取和格式化這些記錄,本節中的一些偏斜數據也很容易與合併函數和條件列協調一致。

每個單獨的付款項目(收入代碼,扣除代碼或稅代碼)被格式化,然後轉到它自己的列。您可以在收入查詢中看到此操作的示例。 PayItemReference查詢是我用作My Pay Items的起點的一些基本過濾器。您可以在該查詢中看到代碼將從列到列,文本和數字混合。代碼和值之間可以有空格,或者沒有空格,也可以完全移動列。

我正在合併代碼和它們的值到常規列,然後我可以合併,unpivot,主軸等,以達到最終的格式。我嘗試過使用條件列和錯誤,但是在原始數據集上總是存在小問題。我只需要一些新的眼睛和新的數據方法。

+0

你需要精確詳細解釋你的數據如何能像它應該如何拆分成多列。在你的例子中,我沒有看到任何變化,因爲所有的行都有7個位置。此外,對於數字來說,如果存在任何。或貨幣符號並且數據的文化也可能相關(例如,2017年2月1日是英國2月1日和美國1月2日) 。 – MarcelBeug

+0

我希望我的編輯能讓這些數據更具代表性。所有數字通常都是十進制數字,因爲它們可以根據上下文表示$ currency或Decimal hours記錄。 – CRSPLK

+0

這還不夠。如果沒有明確的規範說明如何確定哪一部分輸入應放入哪一列,並且有所有可能的備選班次,我們將無法爲您提供幫助。 – MarcelBeug

回答

1

這是一項具有挑戰性的任務。

首先,將表格拆分回頁面是個好主意,因爲每個頁面的列結構可能都是唯一的。因此,我形成表格列表,每個表格爲一頁。然後,我必須處理每個頁面:提取列名稱,爲每行添加摘要信息,過濾不需要的行,並設置列名稱。這是通過使用自定義功能ConvertTable爲列表中的每個表完成的。之後,您只需組合生成的表格。

這裏:

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