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 :

[SQL] Besoin d'aide sur une requête de sélection hardue


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 20
    Points : 12
    Points
    12
    Par défaut [SQL] Besoin d'aide sur une requête de sélection hardue
    Bonjour à tous
    J'ai un problème pour faire une requête.

    J'ai une table de ce style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    IDCOMMANDE          IDCLIENT          DATEACHAT
    1                      1              12/01/2005
    2                      1              25/01/2005
    3                      1              25/01/2005
    4                      1              01/01/2005
    5                      2              01/01/2005
    J'ai besoin de récupérer l'IDCOMMANDE dont c'est la dernière date d'achat.
    Je suis sur SQL Server, j'ai pensé à faire un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT IDCLIENT, MAX(DATEACHAT) as MaxDateAchat
    INTO #DernieresCommandes
    FROM commande
    GROUP BY IDCLIENT
     
    SELECT *
    FROM table
    INNER JOIN #DernieresCommandes
    ON (table.IDCLIENT = #DernieresCommandes.IDCLIENT AND table.DATEACHAT= #DernieresCommandes.MaxDateAchat)
    Manque de bol, si il y a plusieurs achats le même jour, on aura deux lignes, c'est un comportement indésirable.
    je veux n'avoir qu'une seule réponse par client pour des raisons métiers que je ne vais pas développer.

    Intuitivement il me faudrait un truc du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT IDCLIENT, IDCOMMANDE, DATEACHAT
    FROM Commande
    GROUP BY IDCLIENT, IDCOMMANDE
    HAVING MAX(DATEACHAT) = DATEACHAT
    Le problème c'est que ca ne peut pas marcher puisque le group by dissocie les champs.

    quelqu'un a une idée ?

  2. #2
    Membre à l'essai
    Inscrit en
    Janvier 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    bon, y a une méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT t1.IDCLIENT, MAX(IDCOMMANDE)
    FROM COMMANDE t1
    INNER JOIN (
        SELECT IDCLIENT, MAX(DATEACHAT) AS MaxDateAchat
        FROM COMMANDE
        GROUP BY IDCLIENT) AS t2
    ON t1.IDCLIENT = t2.IDCLIENT AND t1.DATEACHAT = t2.MaxDateAchat
    GROUP BY IDCLIENT
    En gros, la table au milieu récupère la date d'achat maximum
    il y a une jointure qui est faite sur cette table avec la table racine.
    puis sur cette table on récupère le maximum sur un autre critère, unique cette fois, on a donc la liste du doublé idclient, idcommande dont c'est la dernière date d'achat.

    pas évident.

+ 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 moonboot dans le forum Oracle
    Réponses: 1
    Dernier message: 01/08/2006, 15h56
  4. [SQL] Besoin d'aide sur une requête
    Par Angath dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/01/2006, 16h26

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