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 :

SUM dans where


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 20
    Points
    20
    Par défaut SUM dans where
    Salut tout le monde!

    J'utilise SQLServer2000
    et voici mon problème :

    J'ai deux table :
    plTache : table qui contient mes taches
    plTP : table qui dit quel tache est faite a quelle date par tel agent

    j'ai 2 types de taches : les taches normales et le taches fixes.
    les taches fixes sont contenu.
    Les taches normales s'intercalent entre les taches fixes.

    dans ma table plTP on connait la date de debut de la tache et la duree.
    il faut donc mettre les taches normal dans les trous(entre 2 dates) laissé par les taches fixes.

    Il faut que je recupere des enregistrments entre 2 dates.

    voici ce que j'ai essayé :
    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
     
    declare @agent varchar(50)
    select @agent = 'A8'
    declare @dateDeb varchar(10)
    select @dateDeb = '20050530'
    declare @dateFin varchar(10)
    select @dateFin = '20050611'
    select distinct A.agentTP,convert(varchar(10),A.dateTP,112)as dateTP, A.dureeTP, C.referenceTAC,C.typeTAC, C.couleurTAC,C.descriptionLongTAC
    	from plTP A, plTACHE C, plTP B,pltache D
    	where A.tacheTP=C.referenceTAC
    	and A.agentTP = @agent
    	and C.typeTAC !='TACHE FIXE'
    	and 	(
    			 A.dateTP >= @dateDeb and  A.dateTP<@dateFin
    		or	(A.dateTP<@dateDeb and A.dateTP+(A.dureeTP+SUM(B.dureetp)*(7/5)) >=@dateDeb))
    	and B.tacheTP=D.referenceTAC
    	and B.agentTP = @agent
    	and D.typeTAC ='TACHE FIXE'
    	and (
    			B.dateTP>= @dateDeb and  B.dateTP<@dateFin
    		or	(B.dateTP<@dateDeb and B.dateTP+(B.dureeTP*(7/5)) >=@dateDeb))
     
    	order by C.typeTAC,C.referenceTAC
    Ca marche pas, c'est juste pour vous donner une idée du problème.
    Pour cette requete, mon probleme est que je ne peux pas faire le SUM.
    Donc si quelqu'un a une solution, même si elle difère completment, je prends.
    Merci d'avance!

  2. #2
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut Re: SUM dans where
    Citation Envoyé par francon81
    Pour cette requete, mon probleme est que je ne peux pas faire le SUM.
    Donc si quelqu'un a une solution, même si elle difère completment, je prends.
    Merci d'avance!
    SUM est une fonction d'agrégation, il faut la tester avec un HAVING

    Cf tuto de sqlPro ici : http://sql.developpez.com/sqlaz/ensembles/#L2
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 20
    Points
    20
    Par défaut
    j'ai essayé avec le having
    ca y est presque, mais j'ai certains cas qui ne sont pas pris en compte.
    voici le code :
    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
     
    SELECT A.agentTP,A.dateTP, A.dureeTP, C.referenceTAC
    FROM plTP A, plTACHE C, plTP B,pltache D
    WHERE A.tacheTP=C.referenceTAC
    	and A.agentTP = @agent
    	and C.typeTAC !='TACHE FIXE'
    	and B.tacheTP=D.referenceTAC
    	and B.agentTP = @agent
    	and D.typeTAC ='TACHE FIXE'
     
    	and B.dateTP+(B.dureeTP*(7/5)) >=A.dateTP
    	and  B.dateTP<@dateFin 
     
    group by A.agentTP,A.dateTP
     
    having (
    	A.dateTP >= @dateDeb and  A.dateTP<@dateFin
         or	(A.dateTP<@dateDeb and A.dateTP+((A.dureeTP+SUM(B.dureeTP))*(7/5)) >=@dateDeb))
    Le problème est que certaines taches fixes ne sont pas toujours prise en compte pour le calcul(SUM) de la duree.

  4. #4
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 396
    Points : 641
    Points
    641
    Par défaut
    Bonjour,
    peut être dois tu passer par une requête imbriquée pour calculer correctement ta durée ?
    La faiblesse humaine est d'avoir des curiosités d'apprendre ce qu'on ne voudrait pas savoir

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 20
    Points
    20
    Par défaut
    moi je veux bien mais comment?

  6. #6
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 396
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par francon81
    Le problème est que certaines taches fixes ne sont pas toujours prise en compte pour le calcul(SUM) de la duree.
    ...
    Citation Envoyé par francon81
    moi je veux bien mais comment?
    Plutôt à toi de nous préciser ce qui ne va pas dans le calcul de ta somme !
    Si ton SGBD le permet, tu pourrais faire dans la clause FROM ou WHERE une sous-requête qui calculerait de manière juste la somme :
    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
     
     
    SELECT A.agentTP,A.dateTP, A.dureeTP, C.referenceTAC 
    FROM plTP A, plTACHE C, plTP B,pltache D,
       (select SUM(B.dureeTP) as TOT_DUREE
           from ... 
          where ...) E
    WHERE A.tacheTP=C.referenceTAC 
       and A.agentTP = @agent 
       and C.typeTAC !='TACHE FIXE' 
       and B.tacheTP=D.referenceTAC 
       and B.agentTP = @agent 
       and D.typeTAC ='TACHE FIXE' 
     
       and B.dateTP+(B.dureeTP*(7/5)) >=A.dateTP 
       and  B.dateTP<@dateFin  and
     
     ( 
       A.dateTP >= @dateDeb and  A.dateTP<@dateFin 
         or   (A.dateTP<@dateDeb and A.dateTP+((A.dureeTP+E.TOT_DUREE)*(7/5)) >=@dateDeb))
    ...
    La faiblesse humaine est d'avoir des curiosités d'apprendre ce qu'on ne voudrait pas savoir

  7. #7
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 20
    Points
    20
    Par défaut
    Ok
    je crois que c'est un truc comme ca:
    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
     
    ELECT agentTP,convert(varchar(10),dateTP,112)as dateTP, dureeTP, referenceTAC,typeTAC, couleurTAC,descriptionLongTAC
    FROM plTP , plTACHE,
       (select SUM(dureeTP) as TOT_DUREE 
           from plTP,plTACHE 
          where tacheTP=referenceTAC
    	and typeTAC ='TACHE FIXE'
    	and agentTP = @agent) E
    WHERE tacheTP=referenceTAC 
       and agentTP = @agent 
       and typeTAC !='TACHE FIXE' 
       and
        	((dateTP >= @dateDeb and  dateTP<@dateFin) 
         or   
    	(dateTP<@dateDeb and dateTP+((dureeTP+TOT_DUREE)*(7/5)) >=@dateDeb)) 
     
    	order by typeTAC,referenceTAC
    Merci à tous pour votre aide

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

Discussions similaires

  1. problème de GROUP BY lors d'un SUM dans le WHERE
    Par cedrick21 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/06/2010, 12h22
  2. select Sum probleme de placement dans where
    Par afroweb dans le forum Langage SQL
    Réponses: 4
    Dernier message: 18/01/2009, 18h16
  3. Utiliser le résultat de SELECT Sum dans If
    Par samlepiratepaddy dans le forum Requêtes et SQL.
    Réponses: 33
    Dernier message: 15/11/2005, 08h38
  4. peut-on utiliser Max dans where ?
    Par chipo dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/06/2005, 14h07
  5. [VBA-E] Fonction sum() dans une cellule
    Par Gonzo dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 16/12/2002, 10h18

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