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

Développement SQL Server Discussion :

Récupération pour une date max


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2011
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Récupération pour une date max
    Bonjour,

    J'ai ma table de base (tablea) sur laquelle je fais plusieurs jointures. Sur les tables jointes, je fais aussi des jointures.

    Mes critères de sélection de base me ramènent plusieurs lignes avec des dates différentes.
    Je souhaite récupérer les données de ma tablea pour la date la plus grande.
    J'ai donc créé une requête de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select a,b,c,d,e,f,g,h,MAX(DayDate)
    from tablea
    inner join tableb on a(tablea)=a(tableb)
    inner join tablec on b(tablea)=b(tablec)
    inner join tabled on c(tableb)=c(tabled)
    where f = 1 and g = '25652'
    group by  a,b,c,d,e,f,g,h
    Le problème c'est que cette requête me ramène la première ligne qu'il rencontre dans ma tablea et n'a pas l'air de se soucier du MAX (il ne s'agit pas forcement de la date la plus grande).

    Quelqu'un peut-il m'aider ?

    S'il y a un autre moyen (select imbriqué par exemple) je peux reconstruire ma requête avec vos conseils, ce n'est pas un problème.

    D'avance merci.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Votre requête vous renvoi la date MAX pour chaque combinaison a/b/c/d/e/f/g/h distincte.

    que voulez-vous obtenir exactement ?

    Je souhaite récupérer les données de ma tablea pour la date la plus grande.
    Si c'est ça, en effet, vous devez rajouter dans le filtre quelque chose comme :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE DayDate = (SELECT MAX(DayDate) FROM tablea)

    Si vous voulez effectuer cette opération en agrégeant vos données (GROUP BY), passez plutot par une jointure sur une pseudo table sélectionnant le max par agrégat

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT A.a, A.b, A.DayDate
    FROM tablea A
    INNER JOIN (
        SELECT a, MAX(dayDate) AS maxdate
        FROM tablea
        GROUP BY a
    ) T 
        ON T.a = A.a 
        AND T.maxdate = A.DayDate

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2011
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Merci de votre réponse, mais ce n'est pas ce que je cherche à faire (manque de détails de ma part, mais quand on est la tête dans son truc ...).

    Pour être plus clair, je vais donner la structure globale des données :
    La tablea est une table client avec toutes les informations (nom, prénom, adresse...)
    Les tables en jointure permettent de récupérer d'autres informations sur les clients.

    Dans la tablea, j'ai plusieurs fois le même client mais à des dates différentes.
    Pour chaque client, je voudrais sélectionner la ligne de la tablea avec la date la plus grande sachant que cette date doit être supérieure à 20100101.
    Attention, pour un client s'il y a des lignes avec des dates inférieures et des dates supérieures à 20100101, je souhaite récupérer l'information. Je ne récupère pas les informations client si toutes les lignes ont une date inférieure.

    Pour un client, la jointure avec les autres tables doit se faire sur une seul et unique ligne de ma tablea.

    Bien sur tout ça en une seule et unique requête .

    J'espère avoir donné suffisament de détails.

    Merci pour tout.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par sanchem Voir le message
    Dans la tablea, j'ai plusieurs fois le même client mais à des dates différentes.


    C'est à dire ?

    plusieurs lignes représentent le même client ????

    qu'est-ce qui permet d'identifer qu'il s'agit du même client ?

  5. #5
    Futur Membre du Club
    Inscrit en
    Avril 2011
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Pour que l'on se comprenne :

    Si j'avais pu décomposé la requête en plusieurs requêtes, j'aurai fait :
    - Récupération de toutes les lignes de la tablea avec une date (DayDate)supérieure à 20100101 : pour certains clients j'aurai encore eu plusieurs lignes par numéro de client. Cette étape m'aurai donné un fichier 1.
    - Suppression des doublons du fichier 1 : une ligne par client (nom/prénom/adresse), je garde les lignes avec la date la plus récente. Cette étape m'aurait donné un fichier 2 avec mes données de base propre.
    - Jointure avec les autres tables pour récupérer les données manquantes et enrichir le fichier 2.

  6. #6
    Futur Membre du Club
    Inscrit en
    Avril 2011
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Merci pour tout, je viens de trouver la solution à mon problème.
    J'ai utilisé une partie de ce que vous m'avez indiqué aieeuuuu (désolé s'il manque des e ou des u ).

    J'ai fait un select distinct sur mes données, ensuite codé mes jointures et pour la clause where :
    where exists (select max(DayDate),mes données) and les autres conditions.

    Encore merci.

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Si j'avais pu décomposé la requête en plusieurs requêtes
    Faites !!!

    La liste des clients, avec la date Max sauf date antérieures au 2010-01-01:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT nom, prenom, adresse, MAX(DayDate) AS MaxDate
    FROM tableA
    WHERE DayDate > '2010-01-01'
    GROUP BY nom, prenom, adresse

    les autres colonnes de la tablea pour chaque client, à la date Max
    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
     
    SELECT
        A.Nom, A.Prenom, A.Adresse, M.MaxDate, A.telephone,...
    FROM tablea A
    INNER JOIN (
        SELECT nom, prenom, adresse, MAX(DayDate) AS MaxDate
        FROM tableA
        WHERE DayDate > '2010-01-01'
        GROUP BY nom, prenom, adresse
    )M 
        ON M.nom = A.nom
        AND M.prenom=A.prenom
        AND M.adresse = A.adresse
        AND M.MaxDate = A.DayDate

    Vous pouvez ensuite ajouter les jointures pour les autres tables

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/05/2012, 16h00
  2. max pour une date
    Par Papy214 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 13/08/2010, 09h40
  3. Regroupement de valeur pour une date
    Par Erakis dans le forum Requêtes
    Réponses: 4
    Dernier message: 15/06/2005, 21h00
  4. [VB.NET] Valur null pour une date.
    Par Lois dans le forum Windows Forms
    Réponses: 2
    Dernier message: 20/12/2004, 14h38
  5. Création requete besoin d'aide pour une date
    Par royrremi dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/07/2004, 22h03

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