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

Requêtes et SQL. Discussion :

Problème d'exécution entre requète et module pour une fonction quartile [AC-2007]


Sujet :

Requêtes et SQL.

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Analyste économétrie
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste économétrie
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Problème d'exécution entre requète et module pour une fonction quartile
    Bonjour à vous,

    Petite présentation puisque c'est mon premier message, je suis néophyte sur Access; je vais également devoir touché à Ruby. Je bosse à Artprice comme chargé d'économétrie,et vais devoir être autonome sur l'exploitation des b2d. Donc je risque de trainer dans le coin dorénavant si vous voulez bien de moi.

    Première mission, première difficulté:

    Je dois créer une fonction quartile afin d'automatiser leeur calcul notamment la médiane des prix pour un artiste.
    J'ai pour variable mt_adjuge_FF pour les prix, ma table est Adecoeuv.
    Voici la fonction que j'ai intégré dans un module :


    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
    Public Function XPercentile(FName As String, _
    TName As String, _
    X As Double) _
    As Double
    ' FName = Nom du champ
    ' TName = Nom de la table
    ' x = percentile décimal (0.68 for 68%)
     
    ' Retourne la valeur minimale pour laquelle
    ' x% des valeurs y sont inférieures ou égales
     
    XPercentile = DMin(FName, TName, _
    "DCount(""*"", """ & TName & """, """ & FName & _
    "<="" & [" & FName & " ]) >= " & _
    X * DCount("*", TName))
    End Function
    Voici la requête pour appeler la fonction :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Adecoeuv.mt_adjuge_FF, XPercentile("[mt_adjuge_FF ]","Adecoeuv", 0.5) AS 50Percentile
    FROM Adecoeuv
    GROUP BY Adecoeuv.mt_adjuge_FF;
    ***

    J'ai le message d'erreur suivant :

    Erreur de syntaxe (virgule) dans l'expression 'DCount("*", "Adecoeuv","[mt_adjuge_FF<])>=3337089,5'.

    J'ai un doute sur ce problème de virgule. Yen a t-il parmi vous pour qui une erreur saute aux yeux ?
    D'avance merci.

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    bonjour,

    je ne vous conseille pas d'utiliser cette fonction (au demeurant très répandue sur le web car écrite par un mvp ) car elle ne retourne pas toujours la bonne valeur.

    Par exemple, pour la série de valeurs suivantes la médiane trouvée est 3 alors que la vraie valeur est 5,5...
    Concernant l'appel de la fonction dans ta requête, il faut mettre des ";" à la place des "," pour séparer les arguments de la fonction xpercentile.

    De plus, je pense que ce sera très long car la requete va calculer la médiane pour chaque ligne de la table et les fonctions de domaine sont particulièrement lentes...

    Philippe

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Analyste économétrie
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste économétrie
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Merci Philippe !
    Sympa pour le conseils. Bon, je vais la tester avec ";" .
    J'ai vu une autre fonction sur un autre forum, je la posterai lundi pour comparaison, et si le coeur vous en dit de revenir par ici !

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Analyste économétrie
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste économétrie
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Bon, je n'arrive pas à faire tourner la fonction, malgré les points virgules insérés pour séparer les paramètres ...
    Au vu du constat sur les défauts de l'algo, je n'insiste pas.

    Voici la seconde fonction dont je parlais :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Function Median(tName$, fldName$) As Single
          Dim MedianDB As Database
          Dim ssMedian As Recordset
          Dim RCount%, i%, x%, y%, OffSet%
          Set MedianDB = CurrentDb()
          Set ssMedian = MedianDB.Openrecordset("SELECT [" & fldName$ & _
                    "] FROM [" & tName$ & "] WHERE [" & fldName$ & "] IS _
                    NOT NULL ORDER BY [" & fldName$  & "];")
          'NOTE: To include nulls when calculating the median value, omit
          'WHERE [" & fldName$ & "] IS NOT NULL from the example.
    ssMedian.MoveLast
          RCount% = ssMedian.RecordCount
          x% = RCount% Mod 2
          If x% <> 0 Then
             OffSet% = ((RCount% + 1) / 2) - 2
             For i% = 0 To OffSet%
                ssMedian.MovePrevious
             Next i
             Median = ssMedian(fldName$)
          Else
             OffSet% = (RCount% / 2) - 2
             For i% = 0 To OffSet%
                ssMedian.MovePrevious
             Next i
             x% = ssMedian(fldName$)
             ssMedian.MovePrevious
             y% = ssMedian(fldName$)
             Median = (x% + y%) / 2
          End If
          ssMedian.Close
          MedianDB.Close
        End Function
    Elle m'arrange d'autant plus qu'elle supprime les valeurs nulles.
    En revanche, je n'arrive pas à l'appeler correctement ... Les "$" me pertubent, entre autres. Moi, j'aurai mis ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Median(["Adecoeuv"]; ["mt_adjuge_FF"]) As Single
    FROM Adecoeuv
    WHERE (((Adecoeuv.cd_arti)=22796))
    GROUP BY Adecoeuv.mt_adjuge_FF;

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    bonjour,

    Les "$" me pertubent, entre autres
    les $ et % permettent de typer les variables. Ces caractères de déclaration de type indiquent que la variable avec un % est de type integer, et celle avec $ indique type string.

    Bien que ce type de déclaration soit encore parfois utile, je te propose d'abandonner ce code de vétéran et de plutôt utiliser la fonction proposer par Tofalu dans la faq.

    pour la requête, en écartant les valeurs null et pour ne retourner qu'une ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT fMediane("Adecoeuv", "mt_adjuge_FF") AS Mediane
    FROM Adecoeuv
    WHERE ((mt_adjuge_FF IS NOT NULL) AND (cd_arti=22796))
    GROUP BY fMediane("Adecoeuv", "mt_adjuge_FF");
    Philippe

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    re bonjour,

    Désolé, j'ai fais une petite erreur et Tofalu aussi...

    mon erreur : il faut modifier légèrement la requête de la fonction de tofalu pour qu'elle ne tienne pas compte des valeurs nulles :
    Remplacer la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set oRST = oDBS.OpenRecordset("SELECT * FROM " & strTable & " ORDER BY " & strField)
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set oRST = oDBS.OpenRecordset("SELECT * FROM " & strTable & " WHERE " & strField & " IS NOT NULL ORDER BY " & strField)
    De plus, une erreur s'est glissé dans sa fonction. En effet, il ne faut pas faire un .MoveNext mais un .MovePrevious.
    Remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
    If blnEven Then 
    oRST.MoveNext 
    ...
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If blnEven Then
             oRST.MovePrevious
    Et la requête devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT fMediane("Adecoeuv", "mt_adjuge_FF") AS Mediane FROM Adecoeuv WHERE (cd_arti=22796) GROUP BY fMediane("Adecoeuv", "mt_adjuge_FF");
    J'espère que cette fois-ci c'est ok...

    PS: Il faudrait qu'un modérateur valide ma remarque concernant la fonction de Tofalu pour ainsi corriger la faq. par avance merci.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/09/2013, 10h49
  2. [MySQL] Problème d'exécution de requête
    Par hedgehog dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 23/02/2007, 15h29
  3. Problème d'exécution de requête
    Par Juanito-Toto dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 26/10/2006, 10h14
  4. problème d'exécution de requête sous VBA?
    Par jessy212 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 26/08/2006, 18h48
  5. [STRUTS/HIBERNATE] Problème d'exécution de requête
    Par mc_chicken dans le forum Hibernate
    Réponses: 5
    Dernier message: 21/10/2005, 09h27

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