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 :

Besoin d'aide sur une requête SQL


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Juin 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Juin 2017
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Besoin d'aide sur une requête SQL
    Bonjour,

    J'aurais besoin d'aide sur une requête SQL sur ma base de données.
    Globalement, j'ai 2 tables:
    - Commande : composée de Client(VARCHAR(2)), WeekID(int), Validated (boolean)
    - Week : composée de WeekID(int), WeekYear(int), WeekNumber(int)

    La table Commande est composée de millions de lignes.
    La table Week de quelques centaintes de lignes.

    J'aurais besoin, pour l'ensemble des Clients (une vingtaine), de récupérer la dernière semaine validée. En gros, récupérer un ResultSet composé de :
    - Client
    - WeekID
    - WeekNumber
    - weekYear

    Un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT c.client, c.weekid, w.weeknumber, w.weekyear FROM Commande AS c JOIN Week as w ON w.id=c.WeekID WHERE c.validated=1 AND (???) GROUP BY c.Client ORDER BY c.Client ASC
    Le problème c'est que je n'arrive pas sélectionner le maximum de WeekNumber et WeekYear pour chaque Client.

    Quelqu'un saurait-il m'aider ?

    Merci d'avance à tous.

    Cordialement,
    Mehdi

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 344
    Points : 39 742
    Points
    39 742
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Cette demande est archi récurrente, voici une possibilité, il y en a d'autres (utilisation de max, de fonction fenêtrées...)

    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
    SELECT c.client
         , c.weekid
         , w.weeknumber
         , w.weekyear 
    FROM Commande AS c 
    inner JOIN Week as w 
      ON w.id=c.WeekID 
    WHERE c.validated=1 
      AND (not exists
           select 1
           from client subc 
           inner join week as subw
              on subw.weekid = subc.weekid
           where subc.client    = c.client
             and subc.validated = 1
             and (   (subw.weekyear = w.weekyear and subw.weeknumber>w.weeknumber)
                  or  subw.weekyear > w.weekyear))
    ORDER BY c.Client ASC
    J'ai supprimé votre groupage qui était à la fois inutile puisque vous ne calculez pas d’agrégat, et invalide puisque incohérente avec les colonnes du SELECT

  3. #3
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Juin 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Juin 2017
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup Escartefigue.
    J'ai dû légèrement modifier la requête comme ceci (ajout de 2 parenthèses pour NOT EXISTS) pour que ça fonctionne sous Apache Derby.
    Le problème que j'avais, c'est qu'il me retournait plusieurs fois la même semaine pour le même client.
    Pour ne me retourner qu'une ligne par client, j'ai ajouté un DISTINCT(...)

    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
    SELECT DISTINCT(c.client)
         , c.weekid
         , w.weeknumber
         , w.weekyear 
    FROM Commande AS c 
    inner JOIN Week as w 
      ON w.id=c.WeekID 
    WHERE c.validated=1 
      AND (not exists(
           select *
           from client subc 
           inner join week as subw
              on subw.weekid = subc.weekid
           where subc.client    = c.client
             and subc.validated = 1
             and (   (subw.weekyear = w.weekyear and subw.weeknumber>w.weeknumber)
                  or  subw.weekyear > w.weekyear)))
    ORDER BY c.Client ASC
    Cordialement,
    Mehdi

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

Discussions similaires

  1. Besoin d'aide sur une requête SQL
    Par omran.info dans le forum Requêtes
    Réponses: 3
    Dernier message: 14/11/2012, 10h28
  2. Besoin d'aide sur une requête SQL
    Par Khyinn dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/07/2010, 21h23
  3. [SQL] Besoin d'aide sur une requête
    Par Angath dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/01/2006, 16h26
  4. Réponses: 1
    Dernier message: 03/08/2005, 11h41

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