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
    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 Expert Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    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 ...
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  3. #3
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    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 Expert

    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
    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
    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 Expert Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    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
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  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 986
    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 986
    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 +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  8. #8
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    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