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

SQL Firebird Discussion :

Régler ce problème en une seule requête


Sujet :

SQL Firebird

  1. #1
    Membre éclairé

    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2010
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2010
    Messages : 297
    Points : 705
    Points
    705
    Par défaut Régler ce problème en une seule requête
    Bonjours,
    J'ai quatre tables en FB 2.1 (les clés primaires son soulignées, les clés étrangères sont en gras):
    Consommations(idconsommations,idvehicules,date_conso,conso_L)
    Vehicules(idvehicules,idcarburants)
    Carburants(idcarburants,type)
    Carb_detail(idcarb_detail,idcarburants,prix,date_effet)

    Les relations entre les tables sont comme suit:
    Consommations---N,1---Vehicules---N,1---Carburants---1,N---Carb_detail.

    Les données:
    Carburants
    idcarburants ____ type
    1_______________Essence
    2_______________Gas-Oil

    Carb_detail
    Idcarb_detail __ Idcarburants ________ Prix ________ Date_effet
    1_______________1________________23,00_________01.01.2010
    2_______________1________________25,00_________01.01.2012
    3_______________1________________30,00_________01.06.2013
    4_______________2________________13,70_________01.01.2010
    5_______________2________________15,00_________01.01.2012
    6_______________2________________16,50_________01.06.2013

    Vehicule
    Idvehicules _____ Idcarburants
    ______1________________1
    ______2________________2

    Consommations
    Idconsommations____idvehicules________Date_conso____ Conso_L
    1____________________1_____________25.05.2011________ 10
    2____________________1_____________12.02.2012__________7
    3____________________2_____________01.12.2011________ 15
    4____________________2_____________02.01.2013__________9
    5____________________2_____________13.08.2013________ 14
    6____________________2_____________25.10.2013________ 23


    Le problème: écrire une requête qui renvoi le résultat suivant
    Idvehicules, Date_conso, Conso_L , Prix, Depense
    Sachant que la colonne Depense = Conso_L * Prix
    et le prix choisis dépend de la date de consommation 'Date_conso' et la date d'effet du prix c à d : pour la consommation du 25.05.2011 je dois avoir le prix 23,00 puisque la date d'effet de ce prix 01.01.2010 < 25.05.2011
    et la date d'effet du prix suivant 01.01.2012 > 25.05.2011.

    Donc le résultat voulu sera:
    Idvehicules______Date_conso____ Conso_L____ Prix________Date_effet______Depense
    1______________25.05.2011________ 10_______23________01.01.2010________ 230
    1______________12.02.2012_________7________25________01.01.2012________ 175
    2______________01.12.2011_________15_______13.7______01.01.2010________ 205.5
    2______________02.01.2013_________9________15________01.01.2012________ 135
    2______________13.08.2013_________14_______16.5______01.06.2013________ 231
    2______________25.10.2013_________23_______16.5______01.06.2013________ 379.5
    Images attachées Images attachées  

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    le plus dur semble être d'aller à la pêche au prix

    Quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT FIRST PRIX FROM CARB_DETAIL WHERE ID_CARBURANT=(idcarburant du vehicule) AND DATE_EFFET<=date_conso 
    ORDER BY DATE_EFET DESC
    devrait fournir la réponse

    ensuite le reste devrait être facile , après les fêtes
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre éclairé

    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2010
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2010
    Messages : 297
    Points : 705
    Points
    705
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    le plus dur semble être d'aller à la pêche au prix
    Quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT FIRST PRIX FROM CARB_DETAIL WHERE ID_CARBURANT=(idcarburant du vehicule) AND DATE_EFFET<=date_conso 
    ORDER BY DATE_EFET DESC
    Cette requête renvoie le prix exacte pour une date_conso donnée c à d que je dois entrer une date de consommation précise pour avoir le prix, mais ce que je veux c'est d'afficher l'ensemble des dépenses (consommation * prix) sur une grille et cette requête ne me facilite pas la tache.
    Avez-vous une idée ??
    Toute solution utilisant une procédure stockée ou autre manouvre sera la bienvenue

  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
    1) Quelle est la date d'effet à prendre en compte pour chaque date de consommation ?
    => On cherche la plus grande date d'effet inférieure ou égale à chaque date de consommation pour le carburant du véhicule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT co.id_vehicules, co.date_conso, co.conso_L, v.idcarburants, MAX(cd.date_effet) AS date_effet
    FROM Consommations co
    INNER JOIN Vehicules v ON v.idvehicules = co.idvehicules
      INNER JOIN Carb_detail cd ON cd.idcarburants = v.idcarburants
    WHERE cd.date_effet <= co.date_conso
    GROUP BY co.id_vehicules, co.date_conso, co.conso_L, v.idcarburants
    2) Quel sont le prix et la dépense correspondants ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT tmp.id_vehicules, tmp.date_conso, tmp.conso_L, , cd1.prix, tmp.date_effet,
      conso_L * prix AS depense
    FROM Carb_detail cd1
    INNER JOIN
    (
      SELECT co.id_vehicules, co.date_conso, co.conso_L, v.idcarburants, MAX(cd.date_effet) AS date_effet
      FROM Consommations co
      INNER JOIN Vehicules v ON v.idvehicules = co.idvehicules
        INNER JOIN Carb_detail cd ON cd.idcarburants = v.idcarburants
      WHERE cd.date_effet <= co.date_conso
      GROUP BY co.id_vehicules, co.date_conso, co.conso_L, v.idcarburants
    ) tmp 
      ON tmp.idcarburants = cd1.idcarburants
      AND tmp.date_effet = cd1.date_effet
    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 éclairé

    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2010
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2010
    Messages : 297
    Points : 705
    Points
    705
    Par défaut
    Merci Super Philippe, toujours là quand personne ne trouve la réponse .
    Que la fête commence

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/10/2009, 17h28
  2. [SQL] En une seule requête
    Par Spaccio dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 26/06/2006, 20h38
  3. Lier trois tables dans une seule requête ?
    Par tempirate dans le forum Requêtes
    Réponses: 2
    Dernier message: 18/06/2006, 19h27
  4. Insérer plusieurs enregistrements en une seule requête
    Par pyd001 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/02/2004, 10h38

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