【问题标题】:Pull data from SQL Server based on Excel Query基于 Excel Query 从 SQL Server 拉取数据
【发布时间】:2020-10-17 18:53:37
【问题描述】:

我目前正在处理一份 PowerBI 报告,我想使用 Excel 文件中的现有查询从 SQL Server 上的数据库中提取特定数据。

示例:
Excel 文件有名为“订单”的列,并且限制为 60 行。

SQL 服务器有一个“订单”和“销售”列,有 400 万行。

我想查询 SQL 服务器以仅检索与我的 excel 文件中的 60 行匹配的行。

我觉得这可能很简单,我忽略了它。

编辑

当我开始收集更多数据并追加时,我忘记了将 Excel 文件更改为 Access 数据库。

我尝试连接的两个表如下所示:

Access Database
ID  |Type  |OrderId  
1   | Sale | Order0001
2   | Sale | Order0002


SQL Server
OrderId  | Cost  |Sales  | StoreId
Order0001|  5.00 | 15.00 | 01
Order0002|  4.00 | 12.00 | 01

Access DB 有 67,000 行,而 SQL Server 有大约 400 万行。它们共享 OrderId 列,当我查询 SQL Server 时,我只想从 Access 数据库中获取 67,000 个订单。

【问题讨论】:

  • 你是不是遇到了sql server查询excel的问题?还是在形成查询时遇到问题?
  • 我在形成查询时遇到问题。我对 SQL 的理解非常有限。我可以编写 SELECT FROM 查询来获取所有订单,但我不确定是否可以执行 WHERE 子句并结合 Excel 查询?

标签: sql-server excel powerbi


【解决方案1】:

我认为你需要这个“技巧”。您将需要修改 m 代码(右键单击您的表格):

https://www.biinsight.com/quick-tips-how-to-filter-a-column-by-a-column-from-a-different-query-in-power-query/ https://www.aaronjgrossman.com/2020/01/25/filter-table-by-another-power-query/

基础是:

#"Filtered Rows" = Table.SelectRows(#"PREVIOUS_STEP", each 
List.Contains(#"REFERENCED_TABLE"[REFERENCED_COLUMN], [COLUMN_TO_BE_FILTERED]))

这类似于 SQL:

SELECT productsubcategorykey          
   , productsubcategoryalternatekey 
   , [Subcategory Name]
FROM   DimProductSubcategory
WHERE  [Subcategory Name] IN (SELECT [Approved Subcategory] 
                          FROM [Product Subcategory Lookup])

【讨论】:

  • 谢谢,我想这会让我进入正确的领域。我现在正在努力让它工作,但我会继续努力,看看我能不能做到。
  • 这行得通。我最终可能会走向不同的方向,因为该查询需要大约 20 分钟才能完成,而且我还不确定我需要多久运行一次,但这让我到达了我需要的地方。
【解决方案2】:

一方面,您可以索引表。此外,您可以过滤 SQL Server 中的数据,并将其插入到帮助表中,然后使用 Excel/VBA 进行查询。访问 7​​6000 条记录绝对比查询 4000000 条记录要快得多。您可以使用 PowerQuery 访问 SQL Server 中的数据。

https://support.microsoft.com/en-us/office/import-data-from-database-using-native-database-query-power-query-f4f448ac-70d5-445b-a6ba-302db47a1b00

此外,PowerPivot 也是一个选项。

https://www.mssqltips.com/sqlservertip/2414/introduction-to-powerpivot-for-excel-and-sql-server/

最后,您可以使用 VBA 来完成这项工作。这可能是最慢的选择。

Sub LoopThroughTable()

Dim Cn As ADODB.Connection
Dim Server_Name As String
Dim Database_Name As String
Dim User_ID As String
Dim Password As String
Dim SQLStr As String
Dim RS As ADODB.Recordset
Set RS = New ADODB.Recordset

Server_Name = "your_server_name"
Database_Name = "your_DB_name"
'User_ID = "******"
'Password = "****"

'loop through all cells in a range
Dim sht As Worksheet
Dim LastRow As Long

'lastRow = Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row
Dim rng As Range, cell As Range
Set sht = ActiveSheet
LastRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row
Set rng = Range("A1:A" & LastRow)

Set Cn = New ADODB.Connection
Cn.Open "Driver={SQL Server};Server=" & Server_Name & ";Database=" & Database_Name & ";"
'& ";Uid=" & User_ID & ";Pwd=" & Password & ";"

RS.Open SQLStr, Cn, adOpenStatic

    For Each cell In rng
    
    SQLStr = "select * from mytable1 Where ID = " & cell.Value
    
    Sheets.Add
    ActiveSheet.Move After:=Sheets(1)
    ActiveSheet.Name = cell.Value
    
        With ActiveSheet.Range("A1")
            .ClearContents
            .CopyFromRecordset RS
        End With
    
        wb.SaveAs "C:\your_path_here\" & cell.Value & " .xlsx"
    Next cell

RS.Close
Set RS = Nothing
Cn.Close
Set Cn = Nothing

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多