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

Langage SQL Discussion :

Requête basique, ou pas


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2009
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 126
    Points : 73
    Points
    73
    Par défaut Requête basique, ou pas
    Bonjour,

    Je cherche à faire une requête mais impossible de trouver la bonne syntaxe.
    Je vous explique :
    Dans ma table Histo j'ai une colonne Reference, une colonne date_action, une colonne num_action et une colonne num_certif.
    A chaque insertion dans Histo, Reference et date_action sont complétés mais num_action et num_certif ne le sont pas forcément.

    Je cherche à récupérer le dernier num_action et num_certif pour chaque référence (dernier dans le sens de plus récent, donc celui qui correspondra à la date la plus récente).
    Le but étant d'avoir au final pour chaque référence le plus récent num_actio et num_certif..

    Si on commence simple pour récupérer uniquement le dernier num_action voici la requête de base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT TB_HISTO.Ref, Max(HISTO.DT_ACTION) AS MaxDT
    FROM HISTO
    WHERE (((HISTO.Num_action) Is Not Null))
    GROUP BY HISTO.Ref;
    Avec ça j'ai bien la dernière date mais à cela je souhaiterai qu'il me sorte le num_action correspondant !! et là impossible à cause de la fonction d'agrégat.. et si je rajoute num_action dans le group_By du coup j'ai tous les num_action qui sortent pour chaque référence...

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 145
    Points : 1 389
    Points
    1 389
    Par défaut
    Bonjour

    Tu peux y arriver en utilisant une sous-requête (voir ce lien par ex) et dans plein de discussion. Il s'agit là d'une discussion classique.

    a+
    olivier
    Merci d'ajouter un sur les tags qui vous ont aidé

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2009
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 126
    Points : 73
    Points
    73
    Par défaut
    Oui je sais qu'on peut faire des sous-requêtes....
    mais là il va donc falloir 2 requêtes pour récupérer le num_action, puis 2 requêtes pour récupérer le num_certif puis un autre requêtes pour joindre les 2 résultats ??
    Il n'y a pas moyen de faire plus simple que 5 requêtes juste pour ça ??

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 716
    Points : 52 380
    Points
    52 380
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par niko9600 Voir le message

    Si on commence simple pour récupérer uniquement le dernier num_action voici la requête de base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT TB_HISTO.Ref, Max(HISTO.DT_ACTION) AS MaxDT
    FROM HISTO
    WHERE (((HISTO.Num_action) Is Not Null))
    GROUP BY HISTO.Ref;
    A cette requête il faut rajouter une jointure sur la table d'origine pour récupérer les informations de détail :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT *
    FROM   HISTO AS H
           INNER JOIN (SELECT TB_HISTO.Ref, Max(HISTO.DT_ACTION) AS MaxDT
                       FROM   HISTO
                       WHERE  HISTO.Num_action Is Not Null
                       GROUP BY HISTO.Ref) AS HMAX
                 ON H.Ref = HMAX.Ref
                 AND H.DT_ACTION = H_MAX.MaxDT;
    Au passage enlevez vos parenthèses elles ne servent à rien (vous êtes tombé sur un stock gratuit ou la touche parenthèse est quadruplées sur votre clavier ???)

    Autre solution avec une fonction de fenêtrage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT *
    FROM
    (
    SELECT *,  
           Max(HISTO.DT_ACTION) OVER(PARTITION BY HISTO.Ref) AS MaxDT 
    FROM   HISTO
    WHERE  HISTO.Num_action Is Not Null
    ) AS T
    WHERE  DT_ACTION = MaxDT;
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre régulier
    Inscrit en
    Septembre 2009
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 126
    Points : 73
    Points
    73
    Par défaut
    Merci pour ton aide Frédéric,

    Au passage enlevez vos parenthèses elles ne servent à rien (vous êtes tombé sur un stock gratuit ou la touche parenthèse est quadruplées sur votre clavier ???)
    lol désolé c'est le générateur Access qui fait ça....

    J'aime bien la forme avec la fonction de fenêtrage mais Access ne connait pas la clause OVER...

    J'ai testé la requête avec le INNER cela ne donne pas le résultat souhaité, en effet d'autres lignes apparaissent avec des Num_action NULL...

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 145
    Points : 1 389
    Points
    1 389
    Par défaut
    Donc il faut utiliser les sous-requêtes

    J'ai testé la requête avec le INNER cela ne donne pas le résultat souhaité, en effet d'autres lignes apparaissent avec des Num_action NULL...
    Pas anormal en soit, à vous adapter la requête de SQLPro en fonction de vos besoin, le modèle est là
    Merci d'ajouter un sur les tags qui vous ont aidé

  7. #7
    Membre régulier
    Inscrit en
    Septembre 2009
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 126
    Points : 73
    Points
    73
    Par défaut
    Bon j'ai rajouté un where num_action is not NULL sur la "sur"requête (H dans l'exemple) et ça passe..
    puis une autre double requête pour le num certif le tout joint dans une 5 requête..

    donc au final pas moyen de faire plus simple apparemment

    Merci pour votre aide.

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

Discussions similaires

  1. [MySQL] requête basique mysql ne fonctionne pas
    Par rvm31 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/08/2011, 22h36
  2. Ma requête ne calcul pas pour tout les champs
    Par leloup84 dans le forum Requêtes
    Réponses: 10
    Dernier message: 01/03/2006, 13h59
  3. [MySQL] Une requête n'aboutissant pas
    Par Livingstone dans le forum Langage SQL
    Réponses: 6
    Dernier message: 13/02/2006, 11h36
  4. [Oracle 9.i] Requête qui passe pas
    Par ftrifiro dans le forum Langage SQL
    Réponses: 7
    Dernier message: 20/12/2005, 18h32
  5. Réponses: 4
    Dernier message: 04/07/2005, 10h36

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