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

Bases de données Delphi Discussion :

calcul d'un cumul en SQL


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    agent de fisc(les impots)
    Inscrit en
    Juillet 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : agent de fisc(les impots)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 427
    Points : 111
    Points
    111
    Par défaut calcul d'un cumul en SQL
    salut tout le monde
    delphi 7 , interbase 6.5
    jais deux table , table agent(num_agent,nom,prenom,..),table maladie(num_maladie,num_agent,date_maladie_du,date_maladie_au,nb_maladie)
    ma question est
    est ce qu'il est possible avec une requette sql calculé le comul des maladie pour chaque agent entre deux date donnee
    merci bien pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 844
    Points
    24 844
    Par défaut
    le comul non !
    mais le cumul oui !
    SUM ou COUNT couplé à un GROUP BY
    et un basique WHERE BETWEEN
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre régulier
    Homme Profil pro
    agent de fisc(les impots)
    Inscrit en
    Juillet 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : agent de fisc(les impots)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 427
    Points : 111
    Points
    111
    Par défaut
    Re
    jai essai avec cette requette
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    with ibquery1 do
    begin
    close;
    sql.clear;
    sql.add('select sum(maladie.nb_maladie),agent.num_agent where agent.num_agent=maladie.num_agent group by agent.num_agent');
    open;
    que pence vous de ma requette,elle juste au fausse

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    Citation Envoyé par kroma23 Voir le message
    Re
    jai essai avec cette requette
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    with ibquery1 do
    begin
    close;
    sql.clear;
    sql.add('select sum(maladie.nb_maladie),agent.num_agent where agent.num_agent=maladie.num_agent group by agent.num_agent');
    open;
    que pence vous de ma requette,elle juste au fausse
    la requête, c'est juste cela
    select sum(maladie.nb_maladie),agent.num_agent where agent.num_agent=maladie.num_agent group by agent.num_agent
    Mais elle est fausse. Où est la clause FROM ?

    Pourquoi ne pas la tester avant ???
    Merci d'ajouter un sur les tags qui vous ont aidé

  5. #5
    Membre régulier
    Homme Profil pro
    agent de fisc(les impots)
    Inscrit en
    Juillet 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : agent de fisc(les impots)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 427
    Points : 111
    Points
    111
    Par défaut
    jai tester ma requette et jai rencontrer un probleme
    dans le cas ou je rentre
    agent 1 a une maladie de 15 jour du 01/01/2012 a 15/01/2012
    agent 1 a une maladie de 5 jour de 20/01/2012 a 24/01/2012

    si je veux faire un cumul des maladie du 01/01/2012 au 22/01/2012 il me donne agent 1 15 jour mais normalement 18 jour

    est ce que vous avez une idee svp
    merci

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    ce n'est pas l'exemple de requête que tu as envoyée !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select sum(maladie.nb_maladie),agent.num_agent where agent.num_agent=maladie.num_agent group by agent.num_agent
    il n'y a rien là-dedans qui indique un calcul sur un intervalle de date.


    Fournis-nous au moins la requête que tu utilises

    Pour te mettre sur la piste, il faut faire la somme des différences.
    Merci d'ajouter un sur les tags qui vous ont aidé

  7. #7
    Membre régulier
    Homme Profil pro
    agent de fisc(les impots)
    Inscrit en
    Juillet 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : agent de fisc(les impots)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 427
    Points : 111
    Points
    111
    Par défaut
    oui je m'exuse
    voila ma requette
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    with ibquery1 do
    begin
    close;
    sql.clear;
    sql.add('select sum(maldie.nb_maladie) as nombre_maladie,agent.num_agent from agent,maldie where agent.num_agent=maldie.num_agent and maldie.date_du>=:dd1 and maldie.date_au<=:dd2 group by agent.num_agent');
    parambyname('dd1').asdate:=strtodate(maskedit1.text);
    parambyname('dd2').asdate:=strtodate(maskedit2.text);
    open;
    end;
    merci bien

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 844
    Points
    24 844
    Par défaut
    Citation Envoyé par kroma23 Voir le message
    agent 1 a une maladie de 15 jour du 01/01/2012 a 15/01/2012
    agent 1 a une maladie de 5 jour de 20/01/2012 a 24/01/2012

    je veux faire un cumul des maladie du 01/01/2012 au 22/01/2012
    il me donne agent 1 15 jour mais normalement 18 jour
    15 c'est logique, la date de fin pour le "5 jour" est HORS du filtre !

    18 beaucoup moins facile à trouver, car ta structure de table gère une période et non jour par jour, du coup, comment faire pour retrancher les jours sur une période partielle !

    Il te faudrait donc faire 3 requêtes
    1- Partiel Fin
    2- Période Entière (celle que tu as déjà)
    3- Partiel Début

    Je corrige ta jointure au passage !

    Cas 1 : Période finissant dans le filtre avec début HORS filtre
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT maladie.nb_maladie, maladie.date_au - :dd1 as Ecart,
    maladie.num_agent, agent.nom, agent.prenom
    FROM maladie 
    INNER JOIN agent ON agent.num_agent = maladie.num_agent 
    WHERE maladie.date_au BETWEEN :dd1 AND :dd2

    Cela utilise deux fois le paramètre :dd1, si BDE cela fonctionne, si ADO voir rustine
    Sinon, remplace par un dd3 qui contiendra la même valeur que dd1
    je te laisse trouver l'opérateur de comparaison de date en IB
    il te faut obtenir l'écart entre la date de début de maladie et le début du filtre pour retrancher les jours manquants
    D'ailleurs, j'espère que les paramètres fonctionne dans le SELECT, je ne crois n'avoir jamais essayé !
    Au pire, tu peux récupérer la date et calcul l'écart et donc le nombre partiel de jour de la période en Delphi et non en SQL

    Idem pour le Cas 3 Période débutant dans le filtre avec fin HORS filtre
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT maladie.nb_maladie, :dd2 - maladie.date_du as Ecart,
    maladie.num_agent, agent.nom, agent.prenom
    FROM maladie 
    INNER JOIN agent ON agent.num_agent = maladie.num_agent 
    WHERE maladie.date_du BETWEEN :dd1 AND :dd2
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    Comme je l'ai déjà indiqué la requête, c'est çà
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT SUM(Maldie.Nb_Maladie) AS Nombre_Maladie,
           Agent.Num_Agent
      FROM Agent, Maldie
    WHERE Agent.Num_Agent = Maldie.Num_Agent
          AND Maldie.Date_Du >= :Dd1
          AND Maldie.Date_Au <= :Dd2
    GROUP BY Agent.Num_Agent
    et c'est plus agréable, plus efficace de la formater pour que l'on puisse la travailler

    Voila pour la forme, sur le fond :
    Penses à utiliser les jointures, ta syntaxe est obsolète depuis 1992
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM tab_1
       INNER JOIN tab_2 ON tab_1.id = tab_2.id...
    Tu n'indiques pas ce que signifie la colonne Maldie.Nb_Maladie ? J'imagine que c'est le nombre de jour de maladie ?
    Si oui la requête doit fonctionner .

    petit détail
    agent 1 a une maladie de 15 jour du 01/01/2012 a 15/01/2012
    agent 1 a une maladie de 5 jour de 20/01/2012 a 24/01/2012

    si je veux faire un cumul des maladie du 01/01/2012 au 22/01/2012 il me donne agent 1 15 jour mais normalement 18 jour
    La somme fait 20

    Mais le résultat de la requête est CORRECT. Ta clause WHERE demande à sélectionner les malades entre le 01/01/2012 et le 22/01/2012. HORS la date de fin de la ligne "2" agent 1 a une maladie de 5 jour de 20/01/2012 a 24/01/2012 est le 24/01 donc en dehors des critères de sélection.
    Merci d'ajouter un sur les tags qui vous ont aidé

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 844
    Points
    24 844
    Par défaut
    @Kroma23 prend effectivement l'habitude de nous fournir le code Delphi ET séparement le code SQL

    @dehorter olivier, tu as aussi [code=sql] pour améliorer encore plus la lecture !

    Sinon, Pour les 20 jours, dehorter olivier, tu n'as pas totalement raison, la demande de Kroma23 est cohérente
    Les 18 jours correspondent bien aux périodes:
    - de 15 jour du 01/01/2012 a 15/01/2012
    - de 3 jour de 20/01/2012 a 22/01/2012

    le problème, c'est que la DB ne contient pas explicitement la période du 20 au 22 (3j) mais implicitement incluse dans la période du 20 au 24 (5j)

    il faut juste gérer la récupération de période partielle comme je l'ai proposée !

    Pour un utilisateur, il y a bien 18 jours entre 01/01/2012 et 22/01/2012
    C'est une déformation d'informaticien de dire que le résultat de 15 est CORRECT !
    Il est informatiquement correct mais concrètement incorrect !

    Va expliquer à l'utilisateur la notion de période intégralement incluse dans les bornes de filtre et qu'il est difficile de récupérer les jours dans des périodes dont un seule des deux bornes est dans le filtre !

    Et il n'en a rien à carrer que le modèle de donnée n'est pas été conçu pour faciliter ce genre de calcul !
    Il veut une valeur métier cohérente et pas dégradé parce que le développeur avait la flemme de le gérer !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  11. #11
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Sinon, Pour les 20 jours, dehorter olivier, tu n'as pas totalement raison, la demande de Kroma23 est cohérente
    Les 18 jours correspondent bien aux périodes:
    - de 15 jour du 01/01/2012 a 15/01/2012
    - de 3 jour de 20/01/2012 a 22/01/2012

    le problème, c'est que la DB ne contient pas explicitement la période du 20 au 22 (3j) mais implicitement incluse dans la période du 20 au 24 (5j)

    il faut juste gérer la récupération de période partielle comme je l'ai proposée !
    tout à fait d'accord

    Citation Envoyé par ShaiLeTroll Voir le message
    Pour un utilisateur, il y a bien 18 jours entre 01/01/2012 et 22/01/2012
    C'est une déformation d'informaticien de dire que le résultat de 15 est CORRECT !
    Il est informatiquement correcte mais concrètement incorrect !
    J'ai hésité à en parler afin que kroma23 (qui doit être informaticien ) puisse poser le doigt sur le problème de cette colonne Nb_Maladie.

    Allez pour me faire pardonner de mon côté vicieux , voici pour kroma23 le lien vers la gestion du temps
    Merci d'ajouter un sur les tags qui vous ont aidé

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 844
    Points
    24 844
    Par défaut
    Citation Envoyé par dehorter olivier Voir le message
    J'ai hésité à en parler afin que kroma23 (qui doit être informaticien ) puisse poser le doigt sur le problème de cette colonne Nb_Maladie
    En même temps, je venais de le faire dans ma réponse précédent la tienne, tu pouvais sans scrupule rebondir dessus !

    Ah SQLPro, toujours une trés bonne référence !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. [v9][crystal] Calcul Du Total Cumule Avec La Variable Shared
    Par BOMBARDIER dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 31/07/2007, 19h47
  2. Calcul d'intégrales en PL/SQL
    Par boxsters dans le forum PL/SQL
    Réponses: 2
    Dernier message: 02/05/2007, 09h09
  3. ! Somme Cumulative en SQL !
    Par dom283 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/03/2007, 18h25
  4. Calcul BD mais dans Requete SQL
    Par forzaxelah dans le forum Bases de données
    Réponses: 5
    Dernier message: 13/05/2006, 20h35
  5. formule de calcul du TRI avec PL/SQL
    Par mongilotti dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 30/07/2005, 20h23

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