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 :

critères et sous requête


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 69
    Points : 58
    Points
    58
    Par défaut critères et sous requête
    bonjour à tous, p'tit soucis avec une requête un peu compliquée pour mon niveau. J'ai une requête qui me permet de filtrer les enregistrements par groupe (pôle, paramètre, solution) et de récupérer la solution correspondante qui possède la date la plus récente.
    pour mieux comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT [MaTable].pôle,[MaTable].paramètre,[MaTable].Solution, Max([MaTable].Date) As Date
    From [MaTable]
    GROUP BY [MaTable].pôle,[MaTable].paramètre,[MaTable].Solution
    HAVING "toutes les conditions"
    ORDER BY (MaTable].Date;
    Seulement, j'ai un champ "Vu" dans ma table d'origine qui propose à l'utilisateur de cocher la case s'il ne souhaite plus voir afficher la solution qui à la date la plus récente du groupe.
    Je souhaite donc ajouter à ma requête la clause WHERE du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE(((MaTable].Vu)=No))
    J'ai essayer pas mal de chose mais la requête prend la date la plus récente de la solution qui n'est pas coché. Ce qu'il faut c'est une requête qui n'affiche pas l'enregistrement de la solution (dont la date est la plus récente) si Vu à été cocher.
    Il faudrait que ma condition Where soit après HAVING :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT [MaTable].pôle,[MaTable].paramètre,[MaTable].Solution, Max([MaTable].Date) As Date
    From [MaTable]
    GROUP BY [MaTable].pôle,[MaTable].paramètre,[MaTable].Solution
    HAVING "toutes les conditions"
    WHERE(((MaTable].Vu)=No))
    ORDER BY (MaTable].Date;
    Merci pour le coup de main et les pistes vers où aller chercher...
    Moi je continue de mon coté...

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Essayes en mettant ta clause Where avec le GroupBy et remplace No par False pour voir. Sinon essaye avec le QBE, et dans ton champ ou tu fais le test Faux, sélectionnes Où dans la liste déroulante de la grille sur la ligne des regroupements.

    Starec

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 69
    Points : 58
    Points
    58
    Par défaut
    bonjour,
    merci starec pour le coup de pouce.
    J'ai testé le WHERE avec GROUP BY mais ca ne veut pas et en sélectionnant où dans la grille ca ne donne pas ce que je veus (le WHERE est avant GROUP BY..HAVING).
    Je cherche encore, j'ai testé le IN (que je découvre). Je vais chercher voir si je peus inclure ma sous requête directement dans ma requête principale du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT [MaSousRequête].Pôle....
    FROM [MaSousRequête]
    WHERE(((MaSousRequête].Vu)=No))
    Je ne sais pas si c'est possible, surtout que je voudrais écrire tout en SQL (La requête principale et la sous requête).
    Voyons voir...
    si vous avez d'autres pistes, je suis preneur!!
    merci d'avance

  4. #4
    Invité
    Invité(e)
    Par défaut
    Heu je me suis planté, c'est la Where avant le GroupBy que je voulais dire...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 69
    Points : 58
    Points
    58
    Par défaut
    j'ai essayé le WHERE avant le GROUP BY avec False mais je n'ai pas le résultat voulu. J'ai essayé d'inclure une sous requête dans la requête principale mais ca ne veut pas non plus...Mon champ "Vu" de la sous requête ne veus pas s'afficher si je met "où" dans la ligne "opération" puisque les autres champs sont sur "regroupement".
    je n'ai plus de piste!! mais je continue de chercher de mon coté...

  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 : 52
    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 à tous,

    je voudrais bien t'aider mais si Starec a compris moi j'ai pas trop bien pigé ce que tu veux.
    Ce qu'il faut c'est une requête qui n'affiche pas l'enregistrement de la solution (dont la date est la plus récente) si Vu à été cocher.
    Solution est un champ: pas un enregistrement. tu te serais mal exprimé?
    sinon faut il comprendre que 'la solution' serait: l'enregistrement dont la date est la plus récente?

    tu ne veux pas que l'enregistrement (dont celle qui a la date la plus récente) apparaissent dans le groupement quand 'Vu' a été coché?
    mais c'est pas non plus ce que tu veux:
    mais la requête prend la date la plus récente de la solution qui n'est pas coché
    (ce que tu ne souhaite pas)

    je t'avoue que je m'y perd.
    pourrais tu t'exprimer autrement?
    voir donner un exemple avec des valeurs?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 69
    Points : 58
    Points
    58
    Par défaut
    tu fais bien de demander storem parce que je pense en effet que ce sont mes explications qui ne sont pas claires...
    J'ai une solution A (qui appartient à un groupe "pôle" et "paramètre"). L'utilisateur prépare la solution (une solution chimique) le 01/01/07. Cette solution sera périmée dans 1 mois soit le 01/02/07. Ma requête permet d'indiquer aux utilisateur que la solution A est périmée (si la date du jour est > au 01/02/07). L'utilisateur reprépare une solution A vu que l'ancienne est périmée, le 01/03/07 par exemple. Après le 01/04/07 la requête indique que la solution A est périmée. Ici l'utilisateur souhaite ne plus voir s'afficher l'info que A est périmée en attendant de préparer une nouvelle solution A. Il coche donc "Oui" dans le champ "Vu". Il faut donc que ma requête filtre les enregistrements par groupe et trouver la solution dont la date de péremption est max. Ca c'est fait!!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT [MaTable].pôle,[MaTable].paramètre,[MaTable].Solution, Max([MaTable].Date) As Date
    From [MaTable]
    GROUP BY [MaTable].pôle,[MaTable].paramètre,[MaTable].Solution
    HAVING "toutes les conditions"
    ORDER BY (MaTable].Date;
    Mais si cette enregistrement à le champ "Vu" sur Faux (case à cocher) alors je souhaite que la requête n'affiche aucun enregistrement plutôt que le dernier dont "Vu" = Non (ici ce serait l'enregistrement du 01/01/07 au 01/02/07). Donc théoriquement il faudrait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT [MaTable].pôle,[MaTable].paramètre,[MaTable].Solution, Max([MaTable].Date) As Date
    From [MaTable]
    GROUP BY [MaTable].pôle,[MaTable].paramètre,[MaTable].Solution
    HAVING "toutes les conditions"
    WHERE(((MaTable].Vu)=No))
    ORDER BY (MaTable].Date;
    Mais en pratique c'est pas ça!!!
    Ouf, j'espère que j'ai été plus clair

  8. #8
    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 : 52
    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
    bon j'ai repris l'origine de ton pb:
    retrouver les solutions qui n'ont pas été refais (de plus de 30j) et pas marqué vu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM MaTable WHERE (MaTable.Solution NOT IN (SELECT MaTable.Solution FROM MaTable WHERE DateDiff("d",[Date],Date())<30)) AND Not Vu
    reverifie qu'il n'y ai pas qq chose qui m'est échappé.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 69
    Points : 58
    Points
    58
    Par défaut
    bonjour vodiem, on se rapproche du but. Le hic c'est que je suis obligé de passer par un regroupement des champs "pôle" "paramètre" et "solution" car une solution "A" préparée par le pôle1 et une solution "A" du pôle 2 sont différentes (bien que ce soit le même produit). Ce qui m'amène utiliser GROUP BY ... HAVING. J' ai également un champ "date de péremption" pour être plus précis, qui est calculé en fonction du jour de la préparation de la solution et du temps de conservation de la solution. J'ai donc utilisé la fonction "max" pour récupérer seulement l'enregistrement de la dernière date de préparation d'une solution spécifique.
    Avec tout ca j'ai essayé d'utiliser ton idée du IN(SELECT...) que je découvre et je cherche...La fonction de regroupement me bloque pas mal de chose...i

  10. #10
    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 : 52
    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
    La fonction de regroupement me bloque pas mal de chose
    ben si le groupement t'embête: ne le mets pas!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM MaTable WHERE ((MaTable.Solution+MaTable.paramètre+MaTable.pôle)  NOT IN (SELECT (MaTable.Solution+MaTable.paramètre+MaTable.pôle) FROM MaTable WHERE DateDiff("d",[Date],Date())<30)) AND Not Vu
    là tu suis encore?

    pour ce qui est de la date de péremption, c'est une formalité...
    tu change la condition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DateDiff("d",[Date],Date())<30
    soit par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DateDiff("d",[Date],[Date de péremption])>0
    ou simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Date]<[Date de péremption]
    mais bon ca t'auras trouvé tout seul non?

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 69
    Points : 58
    Points
    58
    Par défaut
    merci vodiem pour tout,
    je vais testé tout ça, je pense que ca va être ok (j'ai pas eu le temps de testé).
    Je reviendrait si jamais ca bloque mais je pense que la piste que tu m'a donné est ok.
    bonne nuit!! et merci encore

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/11/2013, 17h11
  2. Réponses: 2
    Dernier message: 28/06/2010, 15h57
  3. Requêtes et sous requêtes
    Par lau2nyce dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/03/2004, 15h14
  4. suppression avec sous requête conditionnelle
    Par melmel dans le forum Requêtes
    Réponses: 8
    Dernier message: 18/03/2004, 23h20
  5. Réponses: 3
    Dernier message: 18/05/2003, 00h16

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