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 :

Requête de sélection avec maximum [AC-2000]


Sujet :

Requêtes et SQL.

  1. #1
    Membre expérimenté Avatar de Gabout
    Homme Profil pro
    Utilisateur autodidacte
    Inscrit en
    Mai 2006
    Messages
    1 406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Utilisateur autodidacte

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 406
    Points : 1 683
    Points
    1 683
    Par défaut Requête de sélection avec maximum
    Bonjour,

    Je dispose d'une table composée de 4 champs principaux :
    • evaid l'identifiant numérique long
    • evadat une date
    • evaris la référence à un champ père numérique long
    • evafin une date

    Je voudrais sélectionner les enregistrements dont la date evafin est renseignée et, dans le cas où des enregistrements ont le même père, ne prendre que ceux dont la date evadat et la plus récente.

    J'ai tout d'abord testé en opérant un regroupement
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT tEVA.evaid, Max(tEVA.evadat) AS MaxDeevadat, tEVA.evaris, tEVA.evafin
    FROM tEVA
    GROUP BY tEVA.evaid, tEVA.evaris, tEVA.evafin
    HAVING (((tEVA.evafin) Is Not Null));
    Dans ce cas, il m'affiche tous les enregistrements et ne filtre pas les enregistrements qui ont le même champ père.

    Puis j'ai testé en filtrant la date avec une fonction de domaine
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT tEVA.evaid, tEVA.evadat, tEVA.evaris, tEVA.evafin
    FROM tEVA
    WHERE (((tEVA.evadat)=DMax("evadat","tEVA","evaris=" & [evaris])) AND ((tEVA.evafin) Is Not Null));
    Cela fonctionne tant que les dates de fin evafin sont renseignées. S'il y en a une qui ne l'est pas, aucun enregistrement concerné par le champ père n'est affiché.

    Là... je sèche. Peut être avec des requêtes imbriquées ?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 352
    Points : 415
    Points
    415
    Par défaut
    Avec ta fonction de domaine, tu as mis dans le where
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ... AND ((tEVA.evafin) IS NOT NULL));
    C'est donc normal que cela ne te remonte pas les enregistrements dont le evafin n'est pas renseigné !

    les fonctions de domaine ne sont pas très performantes selon ta quantité de données.

    Tu peux aussi utiliser la clause EXISTS comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT tEva.evaid, tEva.evadat,teva.evaris,teva.evafin 
    FROM tEva
    WHERE exists(SELECT Max(t1.evadat) AS MaxDeevadat, t1.evaris
    FROM tEva t1
    GROUP BY t1.evaris
    HAVING Max(t1.evadat) = tEva.evadat AND t1.evaris = tEva.evaris
    );

  3. #3
    Membre expérimenté Avatar de Gabout
    Homme Profil pro
    Utilisateur autodidacte
    Inscrit en
    Mai 2006
    Messages
    1 406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Utilisateur autodidacte

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 406
    Points : 1 683
    Points
    1 683
    Par défaut
    Bonjour Taoueret,

    Merci de ton aide.

    Ta requête semble filtrer correctement les date les plus récentes mais elle sélectionne quand même les enregistrements qui ont une date de fin vide...

    Si je rajoute le filtre comme ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT tEva.evaid, tEva.evadat, tEva.evaris, tEva.evafin
    FROM tEva
    WHERE (((tEva.evafin) Is Not Null) AND ((Exists (SELECT Max(t1.evadat) AS MaxDeevadat, t1.evaris FROM tEva t1 GROUP BY t1.evaris HAVING Max(t1.evadat) = tEva.evadat AND t1.evaris = tEva.evaris ))<>False));
    les enregistrements vides et ceux non vides ne sont plus affichés

    Par contre, je peux toujours contourner avec un recordset en ajoutant un champ sélection, mais j'aurais aimé ne pas rajouter de champ.

    Une idée ?

  4. #4
    Membre expérimenté Avatar de Gabout
    Homme Profil pro
    Utilisateur autodidacte
    Inscrit en
    Mai 2006
    Messages
    1 406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Utilisateur autodidacte

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 406
    Points : 1 683
    Points
    1 683
    Par défaut
    Taoueret,

    J'ai modifié ta requête comme suit
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT tEva.evaid, tEva.evadat, tEva.evaris, tEva.evafin
    FROM tEva
    WHERE (((Exists (SELECT Max(t1.evadat) AS MaxDeevadat, t1.evaris FROM tEva AS t1 WHERE ((Not (t1.evafin) Is Null)) GROUP BY t1.evaris HAVING (((Max(t1.evadat))=[tEva].[evadat]) AND ((t1.evaris)=[tEva].[evaris]))  ))<>False));
    Peux-tu me confirmer l'exactitude de la syntaxe ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 352
    Points : 415
    Points
    415
    Par défaut
    Oui je pense que cette syntaxe est correcte et qu'il faut effectivement mettre me filtre evafin is not null dans la clause Exists.

  6. #6
    Membre expérimenté Avatar de Gabout
    Homme Profil pro
    Utilisateur autodidacte
    Inscrit en
    Mai 2006
    Messages
    1 406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Utilisateur autodidacte

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 406
    Points : 1 683
    Points
    1 683
    Par défaut
    Bonjour Taoueret,

    Tout fonctionne parfaitement.

    Merci grandement de ton aide,

    A bientôt.

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

Discussions similaires

  1. [WD14] Requête de sélection avec l'éditeur
    Par Aenur56 dans le forum WinDev
    Réponses: 2
    Dernier message: 28/05/2010, 16h10
  2. Requête de sélection avec regrouprement
    Par quentin57 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 03/12/2009, 08h03
  3. UPDATE avec sous requête de sélection avec regroupement
    Par Maxsen dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 09/03/2008, 11h20
  4. [MySQL] Aide requête MySQL : sélection aléatoire d'un enregistrement avec critère
    Par iwf-fr dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 07/05/2007, 09h01
  5. Requête de sélection avec fonction "compte"
    Par KEROZEN dans le forum Access
    Réponses: 3
    Dernier message: 25/05/2006, 10h11

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