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 :

Calculer une moyenne avec des jours absents


Sujet :

Langage SQL

  1. #1
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut Calculer une moyenne avec des jours absents
    Bonjour

    Comment faire pour calculer une moyenne sur une série (date jj/mm/yy | données) en remplaçant les jours absents par le dernier jour disponible ?

    Exemple : j'ai une table remplie tous les jours sauf les week-ends et les jours fériés. Comment faire pour pondérer d'un coefficient 3 les vendredis, d'un coefficient 2 les veilles de jours fériés (ou 3 s'il y a 2 jours fériés, etc) ?

    J'ai plusieurs solutions, mais aucune n'est vraiment satisfaisante sur le plan technique.

    Merci d'avance

  2. #2
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 736
    Points
    1 736
    Par défaut
    ton besoin n'est pas très clair mais si j'ai bien compris, tu as une table avec des colonnes col_date et col_valeur, et tu veux faire une moyenne sur col_valeur pondérée en fonction des valeurs de col_date apparemment

    Pour mettre un poids 3 sur les vendredi et laisser les autres jours avec un poids 1, tu peux essayer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select AVG(CASE WHEN TO_CHAR(col_date,'D') = '5' then 3*col_valeur ELSE col_valeur END) FROM ta_table
    Par contre pour prendre en compte les jours fériés ça me paraît difficile ...

  3. #3
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    Merci, mais j'y avais déjà pensé, et ça marcherait encore mieux avec la fonction DAY() pour les nombreux SGBD qui en disposent.

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Colle ici la définition de la table pour qu'on y voie plus clair.

  5. #5
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    Citation Envoyé par Mercure Voir le message
    Colle ici la définition de la table pour qu'on y voie plus clair.
    Je n'en ai pas la structure sous la main, mais on peut prendre pour exemple la table suivante :

    date | valeur
    17/01/2008 | 50
    20/01/2008 | 100
    21/01/2008 | 70

    La moyenne attendue est (50*3+100+70)/5

    Pour l'instant, la solution que j'ai est :
    - déterminer le nombre de jours de pondération de chaque jour
    17/01/2008 | 3
    20/01/2008 | 1
    21/01/2008 | 1

    - déterminer T, le nombre total de jours avec un select sum sur cette vue

    - faire un select sum(valeur*coefficient)/T sur la table initiale jointe sur la vue des pondérations

    Je ne vois pas comment faire plus simple.

  6. #6
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 736
    Points
    1 736
    Par défaut
    Citation Envoyé par guidav Voir le message
    Je ne vois pas comment faire plus simple.
    Moi non plus, ou alors peut-être avec les fonctions analytiques mais c'est pas mon fort

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 895
    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 895
    Points : 53 123
    Points
    53 123
    Billets dans le blog
    6
    Par défaut
    Il vous faut une table de dates avec tous les jours sans cela c'est impossible. Lisez l'article que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/cours/gestiontemps/

    A +

  8. #8
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    Merci, j'avais déjà lu ton article (très bon au demeurant), mais j'ai réussi à m'en sortir avec la méthode indiquée plus haut. Seule condition : il faut que le premier et le dernier jours soient dans la table initiale.

Discussions similaires

  1. [XL-2003] calcul de moyenne avec des jours fériés
    Par arnest dans le forum Excel
    Réponses: 3
    Dernier message: 22/11/2009, 18h06
  2. Réponses: 14
    Dernier message: 06/05/2008, 15h16
  3. Soustraire une date avec des jours et jours ouvrés
    Par celiaaa dans le forum VBA Access
    Réponses: 5
    Dernier message: 31/05/2007, 22h37
  4. Calculer une moyenne avec une matrice
    Par progfou dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 05/06/2006, 16h47
  5. calculer une moyenne avec une requete externe
    Par allowen dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2005, 16h02

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