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 :

Problème de script SQL : left join et sélection MAX(date)


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Avril 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 11
    Par défaut Problème de script SQL : left join et sélection MAX(date)
    bonjour à tous.

    Voilà, j'ai un projet qui mobilise mes compétences SQL, qui datent de quelques années... J'ai l'impression de repartir de zéro, et ce n'est pas simple!!!!
    Je commence mes scripts simples, et j'ai déjà des soucis...

    J'attaque une base de données via un petit outil de Business intelligence. L'idée est d'attaquer une table (Ensemble_des_pleins) et d'en extraire des infos précises. Cette table répertorie tous les pleins réalisés par mes véhicules (grosse masse d'information). Mon but, c'est d'être capable de sommer les volumes de carburant sur une période donnée, et de connaître le nombre de km parcouru (à chaque fois qu'un chauffeur fait le plein, il indique le nombre de km au compteur).

    Voici une vue de la table Ensemble_des_pleins (qui ne s'appelle pas comme cela dans ma base réelle) (cf piece jointe "table des pleins").
    Nom : table des pleins.PNG
Affichages : 322
Taille : 25,2 Ko


    Dans un premier temps, j'essaye de récupérer le dernier plein de la période (la période sera un champ de filtre dans la feuille excel de restitution).

    Pour cela, j'ai rédigé ce morceaux de script :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select PLEINS.ID_VEHICULE,
        Max(PLEINS.DATPLN) As DATE_DERNIER_PLEIN
      From PLEINS
      Group By PLEINS.ID_VEHICULE
    Je récupère bien le dernier plein réalisé pour chaque véhicule. Maintenant, l'idée c'est de n'avoir qu'une ligne par véhicule, de la table Ensemble_des_pleins, et d'y rajouter la date de mon dernier plein.

    J'ai donc commencé à rédiger ceci, sans succès :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Select PLEINS.ID_VEHICULE, SUM(VOLPLN) as VOLUME_DES_PLEINS, DERNIERPLEIN.DATE_DERNIER_PLEIN
    From PLEINS
     
      Left Join (Select PLEINS.ID_VEHICULE,
                    Max(PLEINS.DATPLN) As DATE_DERNIER_PLEIN
                    From PLEINS
                    Group By PLEINS.ID_VEHICULE) As DERNIERPLEIN
      ON PLEINS.ID = DERNIERPLEIN.ID
     
    GROUP BY PLEINS.ID_VEHICULE

    Et je n'ai rien en faisant cela. Je dois avoir un soucis de logique SQL, mais je n'arrive pas à savoir où.

    Merci d'avance pour votre aide.

    PS : je ne suis pas habitué du site, peut être y a t il un moyen plus sexy d'insérer du contenu SQL?

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 438
    Par défaut
    Bonjour,
    Je pense que tu mélanges les Id dans la requête. La sous-requête renvoie un Id_Vehicule de la table Ensemble_des_pleins, que tu compares ensuite avec Id de la même table.

    Tatayo.

    P.S. pour la mise en page des requêtes, il faut utiliser la balise CODE=SQL.

  3. #3
    Membre habitué
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Avril 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 11
    Par défaut
    Effectivement j'ai corrigé le script après la première version et j'ai oublié que je ne récupère dans ma vue que l'ID_VEHICULE, et non plus l'ID de la table originelle. Je teste cela de suite.

  4. #4
    Membre habitué
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Avril 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 11
    Par défaut
    J'ai corrigé comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Select PLEINS.ID_VEHICULE,
      Sum(PLEINS.VOLPLN) As VOLUME_DES_PLEINS,
      DERNIERPLEIN.DATE_DERNIER_PLEIN
    From PLEINS
      Left Join (Select PLEINS.ID_VEHICULE,
                    Max(PLEINS.DATPLN) As DATE_DERNIER_PLEIN
                    From PLEINS
                    Group By PLEINS.ID_VEHICULE) As DERNIERPLEIN 
      On PLEINS.ID_VEHICULE = DERNIERPLEIN.ID_VEHICULE
    Group By PLEINS.ID_VEHICULE
    Mais toujours rien...

  5. #5
    Membre habitué
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Avril 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 11
    Par défaut
    Bon j'ai réussi à sortir des données en bornant mon script pour limiter la volumétrie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Select PLEINS.ID_VEHICULE,
      Sum(PLEINS.VOLPLN) As VOLUME_DES_PLEINS,
      DERNIERPLEIN.DATE_DERNIER_PLEIN
    From PLEINS
      Left Join (Select PLEINS.ID_VEHICULE,
                  Max(PLEINS.DATPLN) As DATE_DERNIER_PLEIN
                  From PLEINS
                  Group By PLEINS.ID_VEHICULE) As DERNIERPLEIN 
      On PLEINS.ID_VEHICULE = DERNIERPLEIN.ID_VEHICULE
    WHERE YEAR(PLEINS.DATPLN) ="2015"
    AND PLEINS.ID_VEHICULE < "1000"
    Group By PLEINS.ID_VEHICULE
    J'obtiens des résultats, mais l'outil que j'utilise pour extraire les données (INSIDE STUDIO) plante et me met un message d'erreur :
    « Une exception non gérée est survenue dans un composant dans votre application. Si vous cliquez sur "Continuer", l'application va ignorer cette erreur et tenter de continuer.
    La référence d'objet n'est pas définie à une instance d'un objet. »


    Pourtant je ne vois pas ce que mon script peut avoir comme soucis. Je ne comprends pas.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingénieur en études décisionnelles
    Inscrit en
    Février 2013
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur en études décisionnelles

    Informations forums :
    Inscription : Février 2013
    Messages : 134
    Par défaut
    Bonjour,

    Lorsqu'on utilise des guillemets doubles, en général en SQL cela fait référence à un champ. Du coup je trouve étonnant que votre application sorte quand même des données.
    Dans votre filtre where essayez de les retirer, vu que vous restreignez sur des nombres.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE YEAR(PLEINS.DATPLN) =2015
    AND PLEINS.ID_VEHICULE < 1000

Discussions similaires

  1. SQL LEFT JOIN et formulaires Access
    Par AceSonyx dans le forum Access
    Réponses: 5
    Dernier message: 16/06/2014, 09h11
  2. Problème bizarre avec un LEFT JOIN
    Par Gugelhupf dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/04/2014, 15h40
  3. Requête sql left join
    Par nolookpass8 dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/01/2014, 16h40
  4. REQUET SQL LEFT JOIN
    Par cLaSic dans le forum Requêtes
    Réponses: 5
    Dernier message: 28/04/2009, 12h38

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