J'ai un rapport PowerBI sur lequel je travaille actuellement où je voudrais utiliser une requête existante à partir d'un fichier Excel pour extraire des données spécifiques d'une base de données sur un serveur SQL.

Exemple :
Le fichier Excel a une colonne nommée « Commande » et est limité à 60 lignes.

Le serveur SQL a une colonne "Commande" et "Ventes" et possède 4 millions de lignes.

Je voudrais interroger le serveur SQL pour ne récupérer que les lignes qui correspondent aux 60 lignes de mon fichier Excel.

J'ai l'impression que c'est quelque chose qui est probablement très simple et je l'oublie.

MODIFIER

J'avais oublié que j'avais changé mon fichier Excel en une base de données Access alors que je commençais à collecter plus de données et à les ajouter.

Les deux tables que j'essaie de connecter ressemblent à ceci :

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

La base de données Access a 67 000 lignes et le serveur SQL en a environ 4 millions. Ils partagent la colonne OrderId et je souhaite afficher uniquement les 67 000 commandes de la base de données Access lorsque j'interroge le serveur SQL.

0
Bryan Copus 17 oct. 2020 à 21:53

2 réponses

Meilleure réponse

Je pense que vous avez besoin de ces "trucs". Vous devrez modifier le code m (clic droit sur votre table) :

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/

La base est que :

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

C'est quelque chose de similaire à SQL :

SELECT productsubcategorykey          
   , productsubcategoryalternatekey 
   , [Subcategory Name]
FROM   DimProductSubcategory
WHERE  [Subcategory Name] IN (SELECT [Approved Subcategory] 
                          FROM [Product Subcategory Lookup])
0
msta42a 18 oct. 2020 à 18:49

Vous pouvez indexer la table, d'une part. En outre, vous pouvez filtrer les données dans SQL Server et les insérer dans une table d'assistance, puis les interroger avec Excel/VBA. Accéder à 76 000 enregistrements sera absolument beaucoup plus rapide que d'interroger 4 000 000 enregistrements. Vous pouvez utiliser PowerQuery pour accéder aux données dans SQL Server.

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

De plus, PowerPivot est une option.

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

Enfin, vous pouvez utiliser VBA pour faire ce travail. Ce sera probablement l'option la plus lente.

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
0
ASH 24 janv. 2021 à 04:14