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 :

Requête sur un mois.


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 22
    Points : 13
    Points
    13
    Par défaut Requête sur un mois.
    bonjour,

    Je doit réaliser une requêtes sur une table dans laquelle j'ai 3 clés
    - l'immatriculation d'un véhicule
    - Une date / heure
    - kilomètre.

    Ma requête consiste a récupérer le km de début et de fin d'un véhicule en début et fin de mois.

    J'ai donc réaliser cette requête, le hic c'est je n'arrive pas au résultat escompté, vue que je n'ai aucune idée du filtre que je doit effectuer
    Pouvez vous m'aider?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT
    Date
    Immatriculation
    KM
    FROM
    Course_REG
    WHERE
    MONTH(Course_REG.Date) = '09'
    AND YEAR(Course_REG.Date) = '2009'
    Merci pour vos futurs réponse.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Vous pouvez utiliser KEEP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select 
           cr.immatriculation,
           max(cr.date) KEEP (dense_rank first order by cr.date asc) as date_debut,
           max(cr.KM) KEEP (dense_rank first order by cr.date asc) as KM_debut,
           max(cr.date) KEEP (dense_rank first order by cr.date desc) as date_fin,
           max(cr.KM) KEEP (dense_rank first order by cr.date desc) as KM_fin
    from course_reg cr
    WHERE MONTH(cr.Date) = '09'
    AND YEAR(cr.Date) = '2009'
    group by cr.immatriculation

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    KEEP n'existe pas en SQL !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Ta requête (à corriger quand mêmle un peu) va te donner les véhicules qui ont fait une course en septembre 2009.
    S'il y a plusieurs courses dans le mois pour un véhicule, tu auras autant de lignes que de courses.

    Ma requête consiste a récupérer le km de début et de fin d'un véhicule en début et fin de mois.
    On va raisonner progressivement...
    Il te faut d'abord savoir quelles sont les dates de la première et de la dernière course pour chaque véhicule ayant courru durant le mois de septembre 2009.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Immatriculation, MIN(LaDate) AS DateDebut, MAX(laDate) AS DateFin
    FROM Course_REG
    WHERE EXTRACT(MONTH FROM laDate) = 9
      AND EXTRACT(YEAR FROM laDate) = 2009
    GROUP BY Immatriculation
    Maintenant on peut récupérer le kilométrage correspondant aux dates :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT t1.Immatriculation, t1.DateDebut, c1.KM AS KMDebut
    FROM (
      SELECT Immatriculation, MIN(LaDate) AS DateDebut
      FROM Course_REG
      WHERE EXTRACT(MONTH FROM laDate) = 9
        AND EXTRACT(YEAR FROM laDate) = 2009
      GROUP BY Immatriculation
    ) AS t1
    INNER JOIN Course_REG AS c1 ON t1.Immatriculation = c1.Immatriculation
    WHERE c1.laDate = t1.DateDebut
    Idem pour la date de fin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT t2.Immatriculation, t2.DateFin, c2.KM AS KMdFin
    FROM (
      SELECT Immatriculation, MAX(laDate) AS DateFin
      FROM Course_REG
      WHERE EXTRACT(MONTH FROM laDate) = 9
        AND EXTRACT(YEAR FROM laDate) = 2009
      GROUP BY Immatriculation
    ) AS t2
    INNER JOIN Course_REG AS c2 ON t2.Immatriculation = c1.Immatriculation
    WHERE c2.laDate = t2.DateFin
    Ensuite on peut joindre les deux :
    Code : 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
    SELECT c.Immatriculation, tmp1.DateDebut, tmp1.KMDebut, tmp2.DateFin, tmp2.KMFin
    FROM Course_REG AS c
    INNER JOIN (
      SELECT t1.Immatriculation, t1.DateDebut, c1.KM AS KMDebut
      FROM (
        SELECT Immatriculation, MIN(LaDate) AS DateDebut
        FROM Course_REG
        WHERE EXTRACT(MONTH FROM laDate) = 9
          AND EXTRACT(YEAR FROM laDate) = 2009
        GROUP BY Immatriculation
      ) AS t1
      INNER JOIN Course_REG AS c1 ON t1.Immatriculation = c1.Immatriculation
      WHERE c1.laDate = t1.DateDebut
    ) tmp1 ON c.Immatriculation = tmp1.Immatriculation
    INNER JOIN (
      SELECT t2.Immatriculation, t2.DateFin, c2.KM AS KMFin
      FROM (
        SELECT Immatriculation, MAX(laDate) AS DateFin
        FROM Course_REG
        WHERE EXTRACT(MONTH FROM laDate) = 9
          AND EXTRACT(YEAR FROM laDate) = 2009
        GROUP BY Immatriculation
      ) AS t2
      INNER JOIN Course_REG AS c1 ON t2.Immatriculation = c1.Immatriculation
      WHERE c1.laDate = t2.DateFin
    ) AS tmp2 ON c.Immatriculation = tmp2.Immatriculation
    Y a peut-être plus simple mais je n'ai pas forcément le temps de chercher davantage.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    KEEP n'existe pas en SQL !
    C'est vrai, mais le SGBD n'étant pas précisé dans la demande, dans le doute j'ai posté cette solution rapide qui aurait pu être utile.
    J'aurai pu déduire des fonctions MONTH et YEAR que ça ne collerait surement pas, j'ai pas tilté.

    Une autre en passant, en assignant aux lignes des positions ascendantes et descendantes par vehicule et par mois pour ne conserver que les premières et dernières :
    Code : 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
     
    WITH cr
    as
    (
     select 
            immatriculation,
            km,
            date as date_cr,
            row_number() over (partition by immatriculation, extract(month from date_cr), extract(year from date_cr) order by date_cr asc) as position_asc,
            row_number() over (partition by immatriculation, extract(month from date_cr), extract(year from date_cr) order by date_cr desc) as position_desc,
            extract(month from date_cr) as mois,
            extract(year from date_cr) as annee
     from course_reg
    )
    select 
           cr.mois,
           cr.annee,
           cr.immatriculation,
           max(CASE WHEN cr.position_asc = 1 THEN cr.KM END) AS KM_debut,
           max(CASE WHEN cr.position_asc = 1 THEN cr.date_cr END) AS date_debut,
           max(CASE WHEN cr.position_desc = 1 THEN cr.KM END) AS KM_fin,
           max(CASE WHEN cr.position_desc = 1 THEN cr.date_cr END) AS date_fin
    from cr
    where (position_asc = 1 or position_desc = 1)
    group by cr.mois, cr.annee, cr.immatriculation

Discussions similaires

  1. Requêtes sur le mois précédent
    Par schmitx dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 04/05/2014, 22h49
  2. [MySQL] Requête sur un mois complet
    Par wookie33 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 13/12/2013, 11h16
  3. [SQL 2008] Requête : Cumul sur 12 mois glissants
    Par mad_martigan dans le forum Développement
    Réponses: 4
    Dernier message: 23/12/2010, 17h35
  4. Requête sur 12 mois glissant
    Par sandrasemise dans le forum Webi
    Réponses: 5
    Dernier message: 17/08/2010, 15h42
  5. Filtrer le dates sur le mois en cours dans la requête
    Par isabelle b dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 12/12/2008, 01h03

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