条件列和分隔字段

Conditional Columns and Delimited Fields

我每天通过 Power Query 加载到我的 excel sheet 时都会收到每日导出的数据。我无法控制的数据table是:

tblExport

Name Company States
Jane Doe ABC AK,AL,GA,WA
John Smith ACME AK,GA,FL,WA

对于这个问题,我需要用技术信息字符串替换那些州缩写,我将使用“全州名称”作为替代。所以基本上它会根据另一个 table 检查 COMPANY 字段,因为“技术字符串”对于每个州的每个公司都是不同的。

到目前为止还不错,至少我是这么认为的。然后我将 tblExport.States 的定界符拆分为 "," 然后我得到

Name Company States.1 States.2 States.3 States.4
Jane Doe ABC AK AL GA WA
John Smith ACME AK GA FL WA

现在我们引用包含公司、州、FullStateNames

的 table

tblStateNames

COMPANY Abbr State Name
ABC AL AlabamaABC
ABC AK AlaskaABC
ACME AK AlaskaACME
ACME GA GeorgiaACME
ABC FL FloridaABC
ABC WA WashingtonABC
ACME WA WashingtonACME
        ST01 = Table.NestedJoin(#"Changed Type1", {"States.1", "Company"}, 
        tblStateNames, {"Abbr", "Company"}, "tblStateNames", 
        JoinKind.LeftOuter),
        ExpST01 = Table.ExpandTableColumn(ST01, "tblStateNames", {"State 
        Name"}, {"tblStateNames.State Name"}),

在我满足诸如公司 ABC 在 TblExport.States 中拥有 GA 之类的条件之前效果很好,但他们不符合 GA 的条件。因此,当它加入查询 tblStateNames 并且 ABC 与 GA 不匹配时,它 returns 一个空值。

所以我的专栏输出是

Name Company ST01 ST02 ST03 ST04
Jane Doe ABC AlaskaABC AlabamaABC null WashingtonABC
John Smith ACME AlaskaACME GeorgiaACME FloridaACME WashingtonACME

关于这件事的一些事情。最初的 TblExport 是每日摄入量,人们在他们的州范围内,有些人的状态为零,其余的可以是 1 到 40 个州之间的任何地方。挑战以及为什么这是半问题是因为我不能在列中有任何间隙。因此,虽然 ST03 显示为 null,但我宁愿将 ST04 填充到 ST03 列中。

Name Company ST01 ST02 ST03 ST04
Jane Doe ABC AlaskaABC null null WashingtonABC
John Smith ACME AlaskaACME GeorgiaACME FloridaACME WashingtonACME

现在我可以做一个条件 IF ST02 is not equal <> null then ST02 else ST03。然而,在此示例中,null 只是从 ST03 移动到 ST02。但是,这只会将下一个向下移动一列,因此双空仍会导致问题。

在我 PQ 的新手中,我想我需要在进行查询查找之前以某种方式验证原始分隔字段中的状态?

我知道我可能把事情过于复杂了,并且仅出于内部原因屏蔽了实际代码,我需要更长的时间来尝试解释。 :)

感谢任何意见,在回复时,尽量记住我的经验水平。 经验水平: 我是一个高功能白痴

帕特里克

如果我理解,这是一种方法:

  • 读入两个tables
  • 将导出 table 状态缩写拆分为 ROWS
  • 加入 StateName Table
  • 按姓名和公司分组
  • 从每个子table
  • 中提取状态名称的分隔列表
  • 展开该列表

请阅读代码注释并探索应用步骤以更好地理解正在发生的事情

let

//Read in the two tables
    Source = Excel.CurrentWorkbook(){[Name="tblStateNames"]}[Content],
    tblStateNames = Table.TransformColumnTypes(Source, List.Transform(Table.ColumnNames(Source), each {_, type text})),

    Source2 = Excel.CurrentWorkbook(){[Name="tblExport"]}[Content],
    tblExport = Table.TransformColumnTypes(Source2, List.Transform(Table.ColumnNames(Source2), each {_, type text})),

//split the States column by comma into Rows
    #"Split Column by Delimiter" = Table.ExpandListColumn(Table.TransformColumns(tblExport, {
        {"States", Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), 
            let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "States"),

//join with the States Names
    joined = Table.Join(#"Split Column by Delimiter",{"States","Company"},tblStateNames,{"Abbr","COMPANY"}, JoinKind.LeftOuter),
    #"Removed Columns" = Table.RemoveColumns(joined,{"States", "COMPANY", "Abbr"}),
    #"Grouped Rows" = Table.Group(#"Removed Columns", {"Name","Company"}, {
        {"States", each Text.Combine([State Name],";"),type text}}),

//split with no column Count option
    #"Split Column by Delimiter1" = Table.SplitColumn(#"Grouped Rows", "States", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv))
in
    #"Split Column by Delimiter1"