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 :

Pb pour avoir le plus récent entre 2 enregistrements


Sujet :

Développement SQL Server

  1. #1
    Membre expérimenté Avatar de shkyo
    Homme Profil pro
    Développeur Robotique - Administrateur systèmes
    Inscrit en
    Juin 2003
    Messages
    841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Robotique - Administrateur systèmes

    Informations forums :
    Inscription : Juin 2003
    Messages : 841
    Points : 1 474
    Points
    1 474
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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!!!

  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

    Vous pouvez faire comme ceci :

    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
    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;

  3. #3
    Membre expérimenté Avatar de shkyo
    Homme Profil pro
    Développeur Robotique - Administrateur systèmes
    Inscrit en
    Juin 2003
    Messages
    841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Robotique - Administrateur systèmes

    Informations forums :
    Inscription : Juin 2003
    Messages : 841
    Points : 1 474
    Points
    1 474
    Par défaut
    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

  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
    remplacez OUTER APPLY par CROSS APPLY

  5. #5
    Membre expérimenté Avatar de shkyo
    Homme Profil pro
    Développeur Robotique - Administrateur systèmes
    Inscrit en
    Juin 2003
    Messages
    841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Robotique - Administrateur systèmes

    Informations forums :
    Inscription : Juin 2003
    Messages : 841
    Points : 1 474
    Points
    1 474
    Par défaut
    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??

  6. #6
    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
    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

  7. #7
    Membre expérimenté Avatar de shkyo
    Homme Profil pro
    Développeur Robotique - Administrateur systèmes
    Inscrit en
    Juin 2003
    Messages
    841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Robotique - Administrateur systèmes

    Informations forums :
    Inscription : Juin 2003
    Messages : 841
    Points : 1 474
    Points
    1 474
    Par défaut
    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...

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

Discussions similaires

  1. [AC-2013] extraire les dates les plus récentes d'un enregistrement
    Par claireflore dans le forum Access
    Réponses: 1
    Dernier message: 02/08/2014, 07h56
  2. Date la plus récente entre 2 colonnes
    Par okoweb dans le forum Requêtes
    Réponses: 14
    Dernier message: 05/07/2013, 19h12
  3. Réponses: 4
    Dernier message: 27/12/2012, 14h30
  4. Réponses: 6
    Dernier message: 15/08/2011, 11h47
  5. [MySQL] trier des timestamps pour affichage du plus récent
    Par cyberkoa dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 22/03/2010, 08h21

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