PowerQuery中SQL查询结果与原始SKU列表排序不符的解决咨询
按原始SKU列表顺序排序SQL查询结果
可以实现,核心思路是先记录原始SKU的顺序,再将SQL查询结果与原始列表关联后按记录的顺序排序——因为SQL的IN语句不会保证返回结果的顺序和IN列表一致,必须手动维护原始顺序。
修改后的M代码
let // 读取原始SKU列表,添加索引列记录原始顺序 Source = Excel.CurrentWorkbook(){[Name="SKU"]}[Content], AddOriginalOrder = Table.AddIndexColumn(Source, "OriginalOrder", 0, 1, Int64.Type), // 生成SQL查询用的SKU字符串(这部分逻辑保留原代码) Column1 = AddOriginalOrder[Column1], values = List.Transform(Column1, each Text.From(_)), valuesText = Text.Combine(values, "','"), query = "SELECT ITEMNO, [DESC] AS DESCRIPTION FROM DimItem_R WHERE ITEMNO IN ('" & valuesText & "')", target = Sql.Database("XXXXX", "XXXXX", [Query=query]), // 将原始带顺序的列表与SQL结果关联 MergeWithSQLResult = Table.NestedJoin(AddOriginalOrder, {"Column1"}, target, {"ITEMNO"}, "SQLData", JoinKind.LeftOuter), // 展开SQL返回的描述信息 ExpandDescription = Table.ExpandTableColumn(MergeWithSQLResult, "SQLData", {"DESCRIPTION"}, {"DESCRIPTION"}), // 按原始顺序索引排序 SortByOriginalOrder = Table.Sort(ExpandDescription,{{"OriginalOrder", Order.Ascending}}), // 清理冗余列,调整最终列结构 CleanUpColumns = Table.RemoveColumns(SortByOriginalOrder,{"OriginalOrder", "Column1"}), FinalTable = Table.ReorderColumns(CleanUpColumns,{"ITEMNO", "DESCRIPTION"}) in FinalTable
关键逻辑说明
- 添加索引列:
Table.AddIndexColumn给原始SKU列表加上递增序号,这个序号就是原始顺序的唯一标记。 - 表关联:通过
Table.NestedJoin把原始列表和SQL结果用SKU关联,确保每个原始SKU都能匹配到对应的描述。 - 按索引排序:
Table.Sort依据OriginalOrder列排序,就能完全恢复Excel里SKU的原始顺序。 - 清理列:最后移除索引列,调整列顺序,得到符合需求的结果。
如果你的SKU列实际名称不是Column1,记得替换代码中对应的字段名。
内容的提问来源于stack exchange,提问作者ColinA
相关产品推荐
相关产品推荐

