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

Oracle Discussion :

pb date de référence sur double comptage


Sujet :

Oracle

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2006
    Messages : 188
    Points : 71
    Points
    71
    Par défaut pb date de référence sur double comptage
    Bonjour

    ma table activités contient principalement 5 champs

    code (pk)
    plan
    dateprev
    datereal
    equipement

    précisions:
    datereal est nulle tant que plan pas réalisé pour équipement
    dateprev toujours renseignée

    je voudrais compter par un seul select le nombre de réalisés et prévus par plan sur une periode donnée (datedeb-datefin)

    groupés par mois (tout equipement confondus)

    pour un plan donné

    (where plan =:V_PLAN
    and ((dateprev between :datedeb and :datefin) or (datereal between :datedeb and :datefin) )


    mon problème est de trouver la bonne date de regroupement ci dessous compte tenu des précisions ci dessus

    GROUP BY to_char (DATE,'YYYY-MM')


    R&sultat attendu:

    mois réalisés prévus
    2007-01 12 25
    2007-02 05 15
    2007-03 x y etc

  2. #2
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    Bonjour ,

    Essaies ce 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    select activites_prev.mois , activites_prev.nb ,activites_real.nb 
    from /*Sélectionner tous les mois à partir des dates prevues et réelles avec le code du plan */
    (select  plan,to_char(dateprev,'yyyy-mm') mois
    		from activites
    		where plan =:V_PLAN
    			and (dateprev between :datedeb and :datefin)
    		union 
    		select plan ,to_char(datereal,'yyyy-mm') mois
    		from activites
    		where plan =:V_PLAN
    			and (datereal between :datedeb and :datefin) )activites_princ,
    	 ( select code ,to_char(dateprev,'yyyy-mm') mois ,  count(*) nb 
                 FROM activites
    			where plan =:V_PLAN
    			and (dateprev between :datedeb and :datefin)
    			group by plan ,to_char(dateprev,'yyyy-mm')
    			union /*le cas ou la dateprev n'appartient pas a durée de date*/
    			select plan, to_char(datereal,'yyyy-mm') mois ,  0 nb 
                FROM activites
    			where plan =:V_PLAN
    			and (dateprev < :datedeb or dateprev> :datefin)
    			and (datereal between :datedeb and :datefin) ) activites_prev,
    			( select plan ,to_char(datereal,'yyyy-mm') mois ,  count(*) nb 
                FROM activites
    			where plan =:V_PLAN
    			and (datereal between :datedeb and :datefin) and datereal is not null
    			group by plan ,to_char(datereal,'yyyy-mm')
    			union /* le cas ou la datereal est null ou la date prev appartient  à durée de date*/
    			select plan ,to_char(dateprev,'yyyy-mm') mois ,  0 nb 
                FROM activites
    			where plan =:V_PLAN and datereal is null  
    			and dateprev between :datedeb and :datefin	) activites_real     
    where activites_princ.plan =activites_prev.plan 
         and activites_real.plan =activites_prev.plan
    	 and activites_real.mois=activites_prev.mois 
         and activites_princ.mois =activites_prev.mois

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Un peu plus simple :
    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
    SELECT mois, SUM(nb_prev) as prévu, SUM(nb_real) as réalisé
    FROM (
    	SELECT TO_CHAR(dateprev, 'YYYY-MM') AS mois, COUNT(*) AS nb_prev, 0 AS nb_real
    	FROM ACTIVITES
    	WHERE PLAN = :v_plan
    	AND dateprev BETWEEN :datedeb AND :datefin
    	GROUP BY TO_CHAR(dateprev, 'YYYY-MM')
    	UNION ALL
    	SELECT TO_CHAR(datereal, 'YYYY-MM'), 0, COUNT(*) 
    	FROM ACTIVITES
    	WHERE PLAN = :v_plan
    	AND datereal BETWEEN :datedeb AND :datefin)
    	GROUP BY TO_CHAR(datereal, 'YYYY-MM')
    	) 
    GROUP BY mois

  4. #4
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2006
    Messages : 188
    Points : 71
    Points
    71
    Par défaut merci pour soluces
    Pour la 1 ère solution code est une séquence oracle pk de la table activités donc un group by donnerait 1 seule ligne à compter?

    La 2 ème solution fonctionne très bien mais maintenant si je veux compter non plus les mois séparement mais en cumulant les prévus et réalisés par mois depuis datedeb jusqu'à datefin est ce réalisable en partant de ce sql ou faut il repenser Complètement le problème?

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par gg2vig
    La 2 ème solution fonctionne très bien mais maintenant si je veux compter non plus les mois séparement mais en cumulant les prévus et réalisés par mois depuis datedeb jusqu'à datefin est ce réalisable en partant de ce sql ou faut il repenser Complètement le problème?
    On va pas non plus faire le boulot à ta place, faut chercher un peu

    Tu as la fonction oracle "+" qui fonctionne très bien

  6. #6
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2006
    Messages : 188
    Points : 71
    Points
    71
    Par défaut
    je cherche ...mais plutot coté fonctions statistiques oracle(over ...partition by )

    à savoir si en oracle 8i c'est implémenté?

  7. #7
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    Bonjour ,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    en cumulant les prévus et réalisés par mois depuis datedeb jusqu'à datefin
    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
     
    SELECT projet.mois, projet.prévu + projet.réalisé
      FROM (SELECT   mois, SUM (nb_prev) AS prévu, SUM (nb_real) AS réalisé
                FROM (SELECT   TO_CHAR (dateprev, 'YYYY-MM') AS mois,
                               COUNT (*) AS nb_prev, 0 AS nb_real
                          FROM activites
                         WHERE PLAN = :v_plan
                           AND dateprev BETWEEN :datedeb AND :datefin
                      GROUP BY TO_CHAR (dateprev, 'YYYY-MM')
                      UNION ALL
                      SELECT   TO_CHAR (datereal, 'YYYY-MM'), 0, COUNT (*)
                          FROM activites
                         WHERE PLAN = :v_plan
                           AND datereal BETWEEN :datedeb AND :datefin
                      GROUP BY TO_CHAR (datereal, 'YYYY-MM'))
            GROUP BY mois) projet

  8. #8
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Prend le sous-select comme une vue qui te donne 2 lignes par mois (où il y a au moins une date prev ou real). Après tu peux en faire ce que tu veux en 1 seul SELECT FROM VUE GROUP BY MOIS
    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
    SELECT mois, SUM(nb_prev) AS prévu, SUM(nb_real) AS réalisé, 
    sum(nb_prev) + sum(nb_real) as total
    FROM (
    	SELECT TO_CHAR(dateprev, 'YYYY-MM') AS mois, COUNT(*) AS nb_prev, 0 AS nb_real
    	FROM ACTIVITES
    	WHERE PLAN = :v_plan
    	AND dateprev BETWEEN :datedeb AND :datefin
    	GROUP BY TO_CHAR(dateprev, 'YYYY-MM')
    	UNION ALL
    	SELECT TO_CHAR(datereal, 'YYYY-MM'), 0, COUNT(*) 
    	FROM ACTIVITES
    	WHERE PLAN = :v_plan
    	AND datereal BETWEEN :datedeb AND :datefin)
    	GROUP BY TO_CHAR(datereal, 'YYYY-MM')
    	) 
    GROUP BY mois

  9. #9
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2006
    Messages : 188
    Points : 71
    Points
    71
    Par défaut cumul progressif
    je ne parlaiis pas de cumuler réalisés avec prévus

    mais séparement les réalisés et les prévus

    de datedeb à chaque occurence des mois suivant jusqu'à detefin

    par exemple si on prend datedeb=01/01/2006 et datefin = 31/12/2006

    mois prevus réalisés

    01 X01 Y01
    02 (X02+X01) (Y02+Y01)
    03 (X01+X02+X03) (Y01+Y02+Y03)
    04 etc

  10. #10
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Ben voila, avec un petit exemple.. on cherche moins

    Les fonctions analytiques seules peuvent faire celà (après faut voir en 8i ce qui est faisable):
    http://lalystar.developpez.com/fonctionsAnalytiques/

Discussions similaires

  1. Recuperer sujet et date d'emails sur un serveur POP3
    Par Limod dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 28/09/2005, 19h32
  2. date et requete sur etat
    Par Tierisa dans le forum Access
    Réponses: 6
    Dernier message: 28/09/2005, 14h49
  3. forcer date sans texte sur excel
    Par scully2501 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/09/2005, 14h45
  4. Comment avoir une référence sur une Vue
    Par Philippe299 dans le forum MFC
    Réponses: 1
    Dernier message: 12/08/2005, 11h03
  5. Question sur double click
    Par cjacquel dans le forum MFC
    Réponses: 2
    Dernier message: 30/04/2005, 12h53

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