Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/04/2011, 11h03   #1
Invité de passage
 
Inscription : avril 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 8
Points : 1
Points : 1
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 :
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.
sanchem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 11h48   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 ?

Citation:
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 :
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 :
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
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 12h18   #3
Invité de passage
 
Inscription : avril 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 8
Points : 1
Points : 1
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.
sanchem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 13h15   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 13h59   #5
Invité de passage
 
Inscription : avril 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 8
Points : 1
Points : 1
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.
sanchem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 16h06   #6
Invité de passage
 
Inscription : avril 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 8
Points : 1
Points : 1
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.
sanchem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 16h09   #7
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
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 :
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 :
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
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h48.


 
 
 
 
Partenaires

Hébergement Web