IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Excel Discussion :

Excel Power Query et SQL [XL-365]


Sujet :

Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    ingenieur du son
    Inscrit en
    Avril 2017
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingenieur du son
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2017
    Messages : 212
    Par défaut Excel Power Query et SQL
    Bonjour cette discussion est à cheval entre Excel et SQL Serveur désolé ...
    Je me connecte à ma base SQL j'arrive à importer une table tout est ok.

    Prenons par exemple la banale recherche de factures émises entre deux dates deux exercices.
    Ce que j'aimerai c'est d'avoir deux cellules A2 et A3 dans lesquelles l'utilisateur choisis deux dates et que la requête aille chercher les résultats bornés par ces deux dates.

    Suis-je obligé de passer par une ou des macros?

  2. #2
    Membre Expert
    Homme Profil pro
    Formateur et développeur bureautique
    Inscrit en
    Mars 2007
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur et développeur bureautique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 566
    Par défaut
    Bonsoir

    Si vous avez effectué une requête Power Query pour aller chercher les données dans SQL Server, vous pouvez passer en paramètres les valeurs des cellules A2 et A3.

    Pour cela nommer chacune de ces deux cellules.

    Puis, dans la requête, remplacer chacune des valeurs en dur des dates déjà inscrites par :
    Code formule : Sélectionner tout - Visualiser dans une fenêtre à part
    Excel.CurrentWorkbook(){[Name="NomDeLaCellule"]}[Content]{0}[Column1]

    En espérant que cela aide.

    Bonne fin de journée

    Pierre Dumas

  3. #3
    Membre Expert
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 692
    Par défaut
    Bonjour,

    Laisses-tu Power Query gérer le SQL par lui-même ou bien utilises-tu une requête SQL faite "à la main" dans ta requête Power Query?
    Dans les deux cas, ce que tu souhaites est possible mais pour les performances, il faut veiller à ce que ce soit la base de données SQL qui applique le filtre de date et non ton PC. Si c'est ton PC qui le fait, cela veut dire que les données seront téléchargées sans le filtre de date sur ton PC et le filtrage sera ensuite fait dans une étape ultérieure, ce qui est beaucoup plus lent.

    • Dans le cas où tu laisses Power Query gérer le SQL, cela correspond au "Query Folding" qui est la capacité de Power Query à traduire une partie plus ou moins grande des étapes de la requête Power Query en SQL selon comment elles sont organisées.
    • Dans le cas d'une requête SQL paramétrée embarquée dans ton script, je recommande l'utilisation de la fonction Value.NativeQuery qui permet de passer des requêtes ou paramètres Power Query en paramètres SQL.


    Il faudrait un peu plus de détails pour affiner.

  4. #4
    Membre confirmé
    Homme Profil pro
    ingenieur du son
    Inscrit en
    Avril 2017
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingenieur du son
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2017
    Messages : 212
    Par défaut
    Pierre Dumas et Promethee25 merci beaucoup à tous les deux pour vos informations.

    @Promethee effectivement le mieux serait de faire faire le tri à ma base de données et de ne récupérer que le résultat.
    Si par exemple la requête voulue est de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT *
    FROM bdd.dbo.table
    WHERE ReceiveDate between '2022-04-01' and '2023-04-01'
    ORDER BY ReceiveDate
    Afin qu'elle soit exécutée par la base de données comment devrais-je procéder?

    @Pierre Dumas si j'ai bien compris nommant mes deux cellules bornes PremiereCellDate et DeuxiemeCellDate cela donnerai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE ReceiveDate between Excel.CurrentWorkbook(){[Name="PremiereCellDate "]}[Content]{0}[Column1] and Excel.CurrentWorkbook(){[Name="DeuxiemeCellDate "]}[Content]{0}[Column1]

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 692
    Par défaut
    Bonjour,

    Pour une requête aussi simple, je laisserais le "query folding" de Power Query générer le SQL lui-même car cela offre plus d'avantages (même s'il a tendance à imbriquer deux SELECT quand on met un tri).

    Exemple avec une requête MinDate et une requête MaxDate récupérant les deux paramètres Excel et utilisées par la requête attaquant la BDD:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    // MinDate
    let
        Source = Date.From(Excel.CurrentWorkbook(){[Name="MinDate"]}[Content]{0}[Column1])
    in
        Source
     
    // MaxDate
    let
        Source = Date.From(Excel.CurrentWorkbook(){[Name="MaxDate"]}[Content]{0}[Column1])
    in
        Source
     
    // TableSQL
    let
        Source = Sql.Database("ServerName", "DatabaseName"),
        RawTable = Source{[Schema="SchemaName",Item="TableOrViewName"]}[Data],
        #"Filtered Rows" = Table.SelectRows(RawTable, each [Date] >= MinDate and [Date] <= MaxDate),
        #"Removed Other Columns" = Table.SelectColumns(#"Filtered Rows",{"DT number", "Facility", "Date", "User"}),
        #"Sorted Rows" = Table.Sort(#"Removed Other Columns",{{"DT number", Order.Ascending}})
    in
        #"Sorted Rows"
    Avec cette requête, Power Query génère le SQL suivant (visible via clic droit sur la dernière étape de la requête => "Afficher la requête native"):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    select [_].[DT number],
        [_].[Facility],
        [_].[Date],
        [_].[User]
    from 
    (
        select [_].[DT number],
            [_].[Facility],
            [_].[Date],
            [_].[User]
        from [SchemaName].[TableOrViewName] as [_]
        where [_].[Date] >= convert(datetime2, '2023-02-21 00:00:00') and [_].[Date] <= convert(datetime2, '2023-03-21 00:00:00')
    ) as [_]
    order by [_].[DT number]
    Nom : Exemple_QueryFolding.png
Affichages : 1270
Taille : 75,0 Ko

    NB: Pour que le Query folding couvre le plus d'étapes d'une requête (et de la façon la plus optimale), l'ordre des étapes est à gérer avec soin. Il est même capable de gérer des requêtes fusionnées mais va commencer à générer du SQL très peu performant avec un nombre potentiellement important de SELECT imbriqués (en tout cas avec Excel 2016).
    https://learn.microsoft.com/en-us/po...-query-folding

  6. #6
    Membre confirmé
    Homme Profil pro
    ingenieur du son
    Inscrit en
    Avril 2017
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingenieur du son
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2017
    Messages : 212
    Par défaut
    Waouh quelle réponse ... merci pour le temps passé.
    Je vais m'y atteler merci beaucoup.

    Bien sûr j'avais mis cette requête très simple en fait j'en ai deux trois avec 6 à 10 jointures ...

    Petite question subsidiaire ... lors de la première mise en route en sortant de PowerQuery je fais ajouter le tableau résultant où je veux mais après l'utilisateur n'aura plus qu'à changer les dates et "Actualiser" à partir du ruban c'est bien ça ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-365] Excel, Power Query et requêtes
    Par scoobydoos dans le forum Excel
    Réponses: 2
    Dernier message: 29/10/2022, 13h03
  2. Power Query / Identifiants SQL server
    Par Heathcliff_1 dans le forum POWER
    Réponses: 2
    Dernier message: 28/04/2022, 11h04
  3. Réponses: 0
    Dernier message: 05/03/2021, 00h12
  4. [XL-2013] Gestion Bdd avec Excel Power Query
    Par Sylvester2999 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/03/2020, 11h56
  5. Salesforce Excel Power query Filtrer avant chargement
    Par JLV8159 dans le forum Salesforce.com
    Réponses: 0
    Dernier message: 05/09/2018, 12h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo