【问题标题】:power query loop from sql dynamic table name来自 sql 动态表名的电源查询循环
【发布时间】:2016-11-23 15:44:10
【问题描述】:

我有一个在 Power Query 下运行的 MS SQL 以将一些数据导入 Excel。

我们有几个项目和代码来自另一个查询,如下所示:

let
    Source = Projects[Code]
in
    Source

样本数据:

+------+
| code |
+------+
|    2 |
|    3 |
|    6 |
|   76 |
|   77 |
|   78 |
|   79 |
|   80 |
|   81 |
|   82 |
|   83 |
|   84 |
|   85 |
|   86 |
|   87 |
|   88 |
|   89 |
|   90 |
|   91 |
|   92 |
|   93 |
|   94 |
|   95 |
|   96 |
|   97 |
|   99 |
|  100 |
|  101 |
|  102 |
|  103 |
+------+

我想要做的是,为每个项目代码运行以下主查询。

let
    Source = Sql.Database("server", "logo", [Query="select '92' as [santiye] , stockref, DATE_ , AMOUNT, PRICE, total from LG_092_01_STLINE where cancelled = 0 and TRCODE =1"]),
    #"Merged Queries" = Table.NestedJoin(Source,{"stockref"},Query2,{"stockref"},"NewColumn",JoinKind.LeftOuter),
    #"Expanded NewColumn" = Table.ExpandTableColumn(#"Merged Queries", "NewColumn", {"CODE", "NAME"}, {"NewColumn.CODE", "NewColumn.NAME"}),
    #"Removed Columns" = Table.RemoveColumns(#"Expanded NewColumn",{"stockref"}),
    #"Reordered Columns" = Table.ReorderColumns(#"Removed Columns",{"NewColumn.CODE", "NewColumn.NAME", "DATE_", "AMOUNT", "PRICE", "total"}),
    #"Changed Type" = Table.TransformColumnTypes(#"Reordered Columns",{{"santiye", Int64.Type}}),
    #"Merged Queries1" = Table.NestedJoin(#"Changed Type",{"santiye"},Projects,{"Code"},"NewColumn",JoinKind.LeftOuter),
    #"Expanded NewColumn1" = Table.ExpandTableColumn(#"Merged Queries1", "NewColumn", {"Project Name"}, {"NewColumn.Project Name"}),
    #"Renamed Columns" = Table.RenameColumns(#"Expanded NewColumn1",{{"NewColumn.Project Name", "Project Name"}}),
    #"Reordered Columns1" = Table.ReorderColumns(#"Renamed Columns",{"santiye", "Project Name", "NewColumn.CODE", "NewColumn.NAME", "DATE_", "AMOUNT", "PRICE", "total"})
in
    #"Reordered Columns1"

SQL 中的表名应动态更改,并作为循环从其他查询中获取,并一次合并所有数据。

LG_092_01_STLINE = LG_{code}_01_STLINE

[Query="select '92' as = [Query="select {code} as

我在 SQL 查询中做了类似的循环,但“exec()”在电源查询中不起作用。

while @cnt <= @maxrow

begin 

select @firma = nr from (SELECT ROW_NUMBER() over (order by logicalref asc) as NUM, NR FROM L_CAPIFIRM  ) nn where NUM = @cnt   
select @santiye = name from L_CAPIFIRM where NR = @firma

set @firma = RIGHT('000'+CAST(@firma AS VARCHAR(3)),3)
set @items = 'LG_' + convert(nvarchar(3),@firma) + '_ITEMS'
set @stline = 'LG_' + convert(nvarchar(3),@firma) + '_01_STLINE'

【问题讨论】:

    标签: sql sql-server-2008 dynamic foreach powerquery


    【解决方案1】:

    我认为无需编写一行 M 代码就可以很简单地做到这一点,因为您在每个表中的列列表似乎是一致的。

    首先,我将连接到该服务器上的 SQL 数据库并选择任何随机表并编辑生成的查询。然后导航回 Source 步骤并在 Data 列中单击 Database 所在的行。这将为您提供该数据库中的表列表。

    将列表过滤到您想要的表格。您可以使用任何类型的过滤器来执行此操作,或者对于您的场景,您可以通过使用 Join Kind: Inner Join 的 Merge 来实现。

    现在点击数据列标题中的展开按钮。您现在将所选表中的每一行附加在一起。您可以将下游转换添加到此查询中。

    无需一行代码,只需单击 4 次即可完成。 Power Query 是一个非常强大的数据集成工具。

    Power Query 对表架构的变化有着惊人的容忍度——我从未见过这样的事情。它通常会使用常识结果,例如为缺少列的表返回 null、按名称匹配列(而不是 SQL UNION 中的列位置)以及尝试转换具有冲突数据类型的列。它似乎从第一个表生成列列表。一如既往,仔细测试。

    【讨论】:

    • 感谢您的回答,但数据库中的表取决于第一个代码列表。此列表可能会不时更改,因此应该联合的表也会更改...数据库中的示例表名称取决于项目代码列表:LG_002_01_STLINELG_003_01_STLINELG_006_01_STLINELG_076_01_STLINE 等...和我还需要在电源查询中将所有这些表合并到一个表中
    • 我在上面的回答中已经涵盖了这种情况,请参考第 3 段中的过滤步骤。
    • 我想我的知识有限,无法理解您的答案...如果您只需编辑我附加的示例文件,我将非常高兴...Sample File
    • @UmutK - 如果没有连接到 SQL 数据库,这将无法工作。此外,我只会为您构建它作为付费咨询项目(如果您有预算)。
    • 感谢您的时间和支持,我已经根据 Callum Green (adatis) 的文件解决了这个问题,免费...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多