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 22/04/2011, 16h09   #1
Membre chevronné
 
Avatar de shkyo
 
Homme
Administrateur systèmes et réseaux - Développeur VB
Inscription : juin 2003
Messages : 607
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38

Informations professionnelles :
Activité : Administrateur systèmes et réseaux - Développeur VB

Informations forums :
Inscription : juin 2003
Messages : 607
Points : 749
Points : 749
Par défaut Pb pour avoir le plus récent entre 2 enregistrements

Bonjour, alors je résume, c'est pour du suivi de conso de véhicules qui sont soit loués, soit achetés.

J'ai donc une 1ère table qui a son index, une clef étrangère (int), date de début et date de fin (en varchar(10)) , et le type de propriété (tinyint).
Les dates sont toutes au format YYYYMMDD, et il y a les deux pour de la location, et seulement la date du début pour un achat.
Sachant qu'un même véhicule peut avoir été loué, puis acheté.

Dans une autre table j'ai (entre autres) son index, clef étrangère (int), immatriculation (varchar(30)), n° de dossier (varchar(12)), volume de carburant consommé (int) et la date de conso (varchar(10))

Et je veux avoir pour une période donnée, le volume total de carburant des véhicules du dossier, mais dans l'état de la date la plus récente.

Voici ma requête actuelle :
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT SUM(releves.volume) AS volimmat, releves.immat, VehPeriodes.typeprop, VehPeriodes.datdeb, VehPeriodes.datfin FROM releves 
    INNER JOIN VehPeriodes ON releves.cptveh=VehPeriodes.cptveh 
    WHERE releves.nodoss='FRT00008FR'
    AND ((VehPeriodes.typeprop=1 AND VehPeriodes.datfin=''
        AND VehPeriodes.datdeb>'20090107' 
        AND VehPeriodes.datdeb<'20091231')
	OR (VehPeriodes.typeprop>1 
	AND VehPeriodes.datfin>'20090107' 
	AND VehPeriodes.datfin<'20091231'))
GROUP BY releves.immat, VehPeriodes.typeprop, VehPeriodes.datdeb, VehPeriodes.datfin 
ORDER BY immat ASC;
ce qui me donne comme résultats:
volimmat immat typeprop datdeb datfin
2721 2242XB 1 20090706
2721 2242XB 3 20040305 20090705
2607 2244Xx 1 20090702
2607 2244Xx 3 20040401 20090701

Alors, les véhicules sont les bons, mais je voudrais avoir seulement l'état le plus récent, donc ce cas-là, la 1ère et la 3ème ligne.

Comment puis-je faire ça?? ça fait un moment de je cherche, mais je ne suis pas très expérimenté en SQL...

Merci d'avance!!!
__________________
L'homme sage apprend de ses erreurs, l'homme plus sage apprend des erreurs des autres. - Confucius -

Si vous avez quelques minutes, passez donc voir mon site http://www.photospicsandco.com/ Envie de tee-shirts (et goodies!) originaux et sympa ? Visitez mon site... http://www.zazzle.com/shkyo30
shkyo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 17h04   #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

Vous pouvez faire comme ceci :

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
SELECT 
    SUM(releves.volume) AS volimmat, 
    releves.immat, 
    VP.typeprop, 
    VP.datdeb, 
    VP.datfin 
FROM releves 
OUTER APPLY (
    SELECT TOP(1) typeprop, datdeb, datefin
    FROM VehPeriodes
    WHERE VehPeriodes.cptveh = releves.cptveh
        AND (
            (VehPeriodes.typeprop=1 
            AND VehPeriodes.datfin=''
            AND VehPeriodes.datdeb>'20090107' 
            AND VehPeriodes.datdeb<'20091231')
	OR 
            (VehPeriodes.typeprop>1 
	    AND VehPeriodes.datfin>'20090107' 
	    AND VehPeriodes.datfin<'20091231')
        )
    ORDER BY dtedeb DESC
) VP
    WHERE releves.nodoss='FRT00008FR'
 
GROUP BY releves.immat, VP.typeprop, VP.datdeb, VehPeriodes.datfin 
ORDER BY immat ASC;
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 17h26   #3
Membre chevronné
 
Avatar de shkyo
 
Homme
Administrateur systèmes et réseaux - Développeur VB
Inscription : juin 2003
Messages : 607
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38

Informations professionnelles :
Activité : Administrateur systèmes et réseaux - Développeur VB

Informations forums :
Inscription : juin 2003
Messages : 607
Points : 749
Points : 749
Ouch! je n'ai pas l'habitude de ce style de requête...

Je viens d'essayer, ben ça ne fonctionne pas vraiment car ça me sort bien mes 2 véhicules avec la date la plus récente mais aussi 36 autres véhicules du client qui n'ont rien à faire là!

A priori, je pense que les 36 autres sont là car leur date de fin de location est supérieure à 20091231
__________________
L'homme sage apprend de ses erreurs, l'homme plus sage apprend des erreurs des autres. - Confucius -

Si vous avez quelques minutes, passez donc voir mon site http://www.photospicsandco.com/ Envie de tee-shirts (et goodies!) originaux et sympa ? Visitez mon site... http://www.zazzle.com/shkyo30
shkyo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 17h30   #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
remplacez OUTER APPLY par CROSS APPLY
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 17h33   #5
Membre chevronné
 
Avatar de shkyo
 
Homme
Administrateur systèmes et réseaux - Développeur VB
Inscription : juin 2003
Messages : 607
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38

Informations professionnelles :
Activité : Administrateur systèmes et réseaux - Développeur VB

Informations forums :
Inscription : juin 2003
Messages : 607
Points : 749
Points : 749
Citation:
Envoyé par aieeeuuuuu Voir le message
remplacez OUTER APPLY par CROSS APPLY
Ah oui! Là cela fonctionne beaucoup mieux!!! Merci!

Et puis-je savoir la différence entre OUTER APPLY et CROSS APPLY svp??
__________________
L'homme sage apprend de ses erreurs, l'homme plus sage apprend des erreurs des autres. - Confucius -

Si vous avez quelques minutes, passez donc voir mon site http://www.photospicsandco.com/ Envie de tee-shirts (et goodies!) originaux et sympa ? Visitez mon site... http://www.zazzle.com/shkyo30
shkyo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 17h36   #6
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
CROSS APPLY ne renvoi que les lignes de la table de gauche pour lesquels la table de droite (ici la sous requete du APPLY) renvoi au moins une ligne.

OUTER APPLY, renvoi toutes les lignes, avec les colonnes de la table de droite a NULL lorsque la sous requête ne renvoi aucune ligne
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 17h40   #7
Membre chevronné
 
Avatar de shkyo
 
Homme
Administrateur systèmes et réseaux - Développeur VB
Inscription : juin 2003
Messages : 607
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38

Informations professionnelles :
Activité : Administrateur systèmes et réseaux - Développeur VB

Informations forums :
Inscription : juin 2003
Messages : 607
Points : 749
Points : 749
OK je le note, effectivement, j'avais vu la présence de tous ces NULL, merci encore en tout cas, car ce n'est pas facile quand on est habitué à de "petites" requêtes...
__________________
L'homme sage apprend de ses erreurs, l'homme plus sage apprend des erreurs des autres. - Confucius -

Si vous avez quelques minutes, passez donc voir mon site http://www.photospicsandco.com/ Envie de tee-shirts (et goodies!) originaux et sympa ? Visitez mon site... http://www.zazzle.com/shkyo30
shkyo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h05.


 
 
 
 
Partenaires

Hébergement Web