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 :

Ne récupérer que les plus grandes dates


Sujet :

Requêtes et SQL.

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Points : 148
    Points
    148
    Par défaut Ne récupérer que les plus grandes dates
    Bonjour,

    Voilà j'ai une requête sous ACCESS qui me donne un ensemble de ligne :

    Numéro Date
    1 01/01/2010
    1 01/01/2009
    2 01/01/2010
    3 01/01/2010
    3 01/01/2009


    Voilà mais comme résultat je ne voudrais que reprendre les lignes suivantes ayant les plus grandes dates ?

    Numéro Date
    1 01/01/2010
    2 01/01/2010
    3 01/01/2010

    Comment faire ? Merci pour votre retour.

  2. #2
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    Tu fais une requête de regroupement (bouton Σ) et tu choisis le type d'opération Max pour le champ Date.

    A+

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Points : 148
    Points
    148
    Par défaut
    Salut,

    Merci pour ton retour mais en fait en appliquant le regroupement dont tu parles, les autres lignes apparaissent encore.

    Merci pour ton retour.

  4. #4
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    salut LedZeppII et david71,

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from matable where matable.madate=dmax("madate","matable")

  5. #5
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 620
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 620
    Points : 56 862
    Points
    56 862
    Billets dans le blog
    40
    Par défaut
    Bonjour à tous,

    ‘tention Vodiem, si j’ai bien compris la requête doit retourner le maxi par groupement de [numero].

    Citation Envoyé par david71
    …, les autres lignes apparaissent encore.
    Si tu as d’autres champs à afficher dans la sélection, tu peux tenter :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT 
      LaTable.numero,
      T.DateLaPlusRecente,
      LaTable.autrechamp1,
      LaTable.autrechamp2,
      LaTable.autrechamp3 
    FROM LaTable INNER JOIN
    (
      SELECT 
      numero,
      Max(LaDate) as DateLaPlusRecente
      FROM LaTable
      GROUP BY numero
    ) T
    ON LaTable.numero=T.numero AND LaTable.LaDate=T.DateLaPlusRecente;

  6. #6
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    salut f-leb,

    Citation Envoyé par f-leb
    ‘tention Vodiem, si j’ai bien compris la requête doit retourner le maxi par groupement de [numero].
    ‘tention f-leb de ne pas tout prendre pour argent comptant. ;p
    rien ne permet d'affirmer qu'il s'agit d'un regroupement c'est ainsi que l'a compris LedZeppII et la réponse ne convenait pas, je lui laisse le soin de répondre dans cette voie si effectivement il y a regroupement sur d'autres champs qui empêche la restriction voulu.
    ta solution est pertinente autant que celui de LedZeppII.

    même les mauvaises propositions sont bonne dans la mesure où elle permettent de mieux cerner le pb.

  7. #7
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 620
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 620
    Points : 56 862
    Points
    56 862
    Billets dans le blog
    40
    Par défaut
    Bonsoir Vodiem,

    J’aurais dû être moins catégorique avec mon "'tention", désolé.

    J’avais en tête que le problème de david71, quand il écrit :
    Citation Envoyé par david71
    …les autres lignes apparaissent encore.
    était dû à d’éventuels autres champs (non fonctionnellement dépendants du champ [numero]) qu’il a fait glisser dans les colonnes de l’assistant graphique qui, au niveau SQL, aurait généré un regrettable :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT numero, Max(maDate), autrechamp1, autrechamp2
    FROM maTable
    GROUP BY numero, autrechamp1, autrechamp2

    Mais tu as raison, ça se trouve c’est tout autre chose et j’me gaufre total

    Note qu’en complétant ta proposition avec dmax :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM matable 
    WHERE matable.madate=dmax("madate","matable","numero=" & matable.numero )
    on devrait retrouver les mêmes lignes que ma requête de mon message précédent.

    Attendons la réponse de david71…

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Points : 148
    Points
    148
    Par défaut
    Salut à tous,

    Merci pour vos réponses dans lesquelles je me perds un peu.
    En fait, voilà simplement la requête sans critère de regroupement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT LS1A_CLIENT.C_CLIENT AS 2, LS1A_ENGAGEMENT.NUM_ENGAGEMENT AS 3, "" AS 73, "" AS 104, "1" AS 120, Left([D_DEB_ENGAG],10) AS 50000, Left([D_DEB_PERIODE],10) AS 50001, Left([D_FIN_PERIODE],10) AS 50002, Left([D_FACTU_PREVUE],10) AS 50003, Left([D_FIN_ENGAG],10) AS 50004, Trim([C_PERIOD_FACTURATION]) AS 50005, LS1A_ENGAGEMENT.C_TYP_FACTURATION AS 50006, LS1A_ACTIVITE.C_ID_ACTIVITE AS 50007, "" AS 50008, "" AS 50009, "2010" AS 50010, "" AS 50011
    FROM ((LS1A_ACTIVITE INNER JOIN LS1A_ENGAGEMENT ON LS1A_ACTIVITE.C_ID_ACTIVITE = LS1A_ENGAGEMENT.C_ID_ACTIVITE) INNER JOIN LS1A_CLIENT ON LS1A_ENGAGEMENT.C_ID_CLIENT = LS1A_CLIENT.C_ID_CLIENT) LEFT JOIN LS1A_ECHEANCE ON LS1A_ENGAGEMENT.C_ID_ENGAG = LS1A_ECHEANCE.C_ID_ENGAG
    ORDER BY LS1A_ENGAGEMENT.NUM_ENGAGEMENT;
    Donc en fait je ne souhaite qu'avoir les lignes avec les plus grandes D_DEB_PERIODE. Est-ce jouable ?

    Merci.

  9. #9
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 620
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 620
    Points : 56 862
    Points
    56 862
    Billets dans le blog
    40
    Par défaut
    Salut,

    Tu peux donner un exemple de ce que retourne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Left([D_DEB_PERIODE],10)
    une date ? quel format ?

    Dans ton 1er message, tu souhaitais un regroupement par [numéro]. Quel est le champ qui joue ce rôle dans ta requête ? 

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Points : 148
    Points
    148
    Par défaut
    f-leb,

    D_DEB_PERIODE est une date dans laquelle je ne souhaite que prendre les 10 premiers caractères de gauche type jj/mm/aaaa

    Oui je souhaite faire un regroupement selon le champ
    LS1A_ENGAGEMENT.NUM_ENGAGEMENT

    Si tu as des idées elles sont les bienvenues....
    Merci.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Points : 148
    Points
    148
    Par défaut
    J'ai tout stocké dans une table temporaire engagement et maintenant j'ai la requête suivante ACCESS :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT engagement.[2], engagement.[3], engagement.[73], engagement.[104], engagement.[120], engagement.[50000], engagement.[50001], engagement.[50002], engagement.[50003], engagement.[50004], engagement.[50005], engagement.[50006], engagement.[50007], engagement.[50008], engagement.[50009], engagement.[50010], engagement.[50011]
    FROM engagement
    WHERE (((engagement.[50001])=DMax([50001].[engagement],[engagement])));
    Voyez-vous ce qui ne convient pas ?

    Merci pour votre réponse.

  12. #12
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 620
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 620
    Points : 56 862
    Points
    56 862
    Billets dans le blog
    40
    Par défaut
    Re,

    essaye avec :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM NomDeTaRequete 
    WHERE [50001]=dmax("CDate([50001])","NomDeTaRequete","[3]=" & [3] )
    ORDER BY [3];

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Points : 148
    Points
    148
    Par défaut
    Salut f-leb,
    Merci pour ton message mais cela ne fonctionne pas j'ai le problème suivant avec la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT * FROM engagement 
    WHERE [50001]=dmax("CDate([50001])","engagement","[3]=" & [3] )
    ORDER BY [3] desc;
    L'expression entrée comme paramètre de requête est à l'origine de l'erreur suivante : impossible pour ms access de trouver le nom 'DIGIF' entré dans l'expression.

    En fait le problème c'est que la colonne [3] n'est pas un code numérique mais un code alphanumérique....d'où peut-être l'erreur ?

    Merci pour ton retour.

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Points : 148
    Points
    148
    Par défaut
    Je pense que le problème sur la colonne 3 est que j'ai des codes alphanumériques.

    Exemples :

    10103-ST1427
    0602863F-ST5569
    10001AGC533

    ...

  15. #15
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 620
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 620
    Points : 56 862
    Points
    56 862
    Billets dans le blog
    40
    Par défaut
    Bonjour,

    avec [3] alphanumérique, il faut tenter:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM engagement 
    WHERE [50001]=dmax("CDate([50001])","engagement","[3]='" & [3] & "'" )
    ORDER BY [3] desc;

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Points : 148
    Points
    148
    Par défaut
    C'est bon merci beaucoup f-leb ça marche ! Je n'ai pas trop l'habitude des expressions access "[3]=" & [3]....
    Manquait les cotes...

    Et en SQL normal ça donnerait quoi l'équivalent de dmax ?

  17. #17
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 620
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 620
    Points : 56 862
    Points
    56 862
    Billets dans le blog
    40
    Par défaut
    sur le modèle de la requête du message #5, ça devrait donner:

    Code sql : 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
    SELECT 
      Engagement.[2],
      Engagement.[3],
      Engagement.[50001],
      Etc… à compléter
     
    FROM Engagement INNER JOIN
    (
      SELECT 
      [3],
      Max(CDate([50001])) AS DateLaPlusRecente
      FROM Engagement
      GROUP BY [3]
    ) T
    ON Engagement.[3]=T.[3] AND Engagement.[50001]=T.DateLaPlusRecente
    ORDER BY Engagement.[3] DESC;

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/07/2012, 13h33
  2. Réponses: 2
    Dernier message: 07/03/2012, 17h53
  3. Réponses: 2
    Dernier message: 18/03/2009, 07h48
  4. Réponses: 2
    Dernier message: 20/02/2007, 10h29
  5. Requete récupérer les 3 numéros les plus grands
    Par nerick dans le forum Langage SQL
    Réponses: 2
    Dernier message: 05/01/2006, 13h51

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