【问题标题】:Power Query - Can a range be queried using SQL?Power Query - 可以使用 SQL 查询范围吗?
【发布时间】:2022-04-20 01:59:09
【问题描述】:

我有一个名为 tDetails 的范围。如何使用 SQL 进行查询?

我单击我的范围,然后在 Power Query 选项卡上单击“从表/范围”。这将打开 Power Query 编辑器。

在高级编辑器中,我看到如下内容:

let
    Source = Excel.CurrentWorkbook(){[Name="tDetails"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"User ID", type text},
    {"Company", type text}, 
    {"State", type text},
    {"Billed", type Int65.Type}})
in
    #"Changed Type"

如何查询这些数据?我需要做以下事情:

SELECT 'UserID'   = "User ID"
,      'Discount' = "Billed" * .51
,      'Note'     = CASE WHEN State = 'NY' THEN 'Standard'
                         WHEN State = 'OH' THEN 'Second'
                         WHEN State = 'CA' THEN 'Third'
                         ELSE 'Fourth' END
FROM    Source
WHERE   "State"   = "NY"

另外,这里可以使用临时表吗?

SELECT 'UserID'   = "User ID"
,      'Discount' = "Billed" * .51
INTO    #UserDiscount
FROM    Source
WHERE   "State"   = "NY"

SELECT * FROM #UserDiscount ORDER BY Discount DESC

这些是超级基本的例子。我真正需要做的事情要复杂得多,但这会给我一个起点。

谢谢!

【问题讨论】:

标签: powerquery m


【解决方案1】:

我认为等效的 Power Query 会是

    let
    Source = Excel.CurrentWorkbook(){[Name="tDetails"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"User ID", type text},
    {"Company", type text}, 
    {"State", type text},
    {"Billed", type Int65.Type}})
    #"Filtered Rows" = Table.SelectRows(#"Changed Type", each ([State] = "NY")),
    #"Added Custom" = Table.AddColumn(#"Filtered Rows", "Discount", each [Billed]*0.51),
    #"Added Custom1" = Table.AddColumn(#"Added Custom", "UserID", each [UserID]),
    #"Removed Other Columns" = Table.SelectColumns(#"Added Custom1",{"UserID", "Discount", "Billed"})
in
    #"Removed Other Columns"

此外,Power Query 中 SQL #temp table 的等效项将使用 table variable。在电源查询中,每个步骤都是表变量,例如Source, #"Changed Type", #"Filtered Rows", #"Added Custom".... 包含在该步骤中评估的表。您可以在后续步骤中继续使用每个表变量中包含的表。

例如

    let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUcrPS1WK1YlWMgKyS8rzwWxjEDujKBUoEwsA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Column1 = _t, Column2 = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", Int64.Type}, {"Column2", type text}}),
    Custom0 = Table.SelectRows(#"Changed Type", each ([Column2] = "one")),
    Custom1 = Table.SelectRows(#"Changed Type", each ([Column2] = "two")),
    Custom2 = Table.SelectRows(#"Changed Type", each ([Column2] = "three")),
    Custom3 = Custom0&Custom1&Custom2
in
    Custom3

【讨论】:

    【解决方案2】:

    是的,但是您必须使用保留函数SqlExpression.ToExpression,并且根据 Power Query 可能需要 T-SQL 格式,您的 SQL 看起来不是“有效”的,因此您必须进行试验以及如何处理引号和重命名列。

    详情见此页面:https://bengribaudo.com/blog/2021/07/13/5868/m-mysteries-sqlexpression-toexpression

    查询:

    // tDetails
    // Input from Excel range. This example uses embedded data so you can replicate my result.
    let
        Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WcspPUtJRcs7PK8kvzgey/CKBhKGRsYlSrE60kldqWhqKtL8HSNoADJRiYwE=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"User ID" = _t, Company = _t, State = _t, Billed = _t]),
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"User ID", type text}, {"Company", type text}, {"State", type text}, {"Billed", Int64.Type}})
    in
        #"Changed Type"
    
    // Result
    // Executes translated M code
    let
        ReferenceTables = [Source = tDetails],
        Source = Expression.Evaluate(SQL, #shared)(ReferenceTables)
    in
        Source
    
    // SQL
    // Translates SQL to M
    let
      ReferenceTables = [Source = tDetails],
      SqlQuery = "SELECT [User ID] as UserID, Billed * 0.51 as Discount, 'Standard' as [Note] FROM Source WHERE State = 'NY'",
      TranslatedToM = SqlExpression.ToExpression(SqlQuery, ReferenceTables)
    in
      TranslatedToM
    

    t详情:

    我的 SQL 有效: SELECT [User ID] as UserID, Billed * 0.51 as Discount, 'Standard' as [Note] FROM Source WHERE State = 'NY'

    结果:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      • 2013-12-25
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多