2 votes

Obtenir la moyenne hebdomadaire des jours ouvrables de chaque semaine

Je dois trouver la moyenne hebdomadaire du tableau ci-dessous (seulement les jours ouvrables - du lundi au vendredi). Le numéro que je recherche à moyenner est AVAI_NUM. Je dois calculer la moyenne de AVAI_NUM pour chaque semaine dans la période donnée.

Exemple : Si la période est janvier 2016 :

déclarer @dDateFrom date = cast('2016-01-01' as date)
déclarer @dDateTo date = cast('2016-01-31' as date)

Le tableau ressemble à ceci :

déclarer @scavai table
(
    avai_key int,
    avai_dat date,
    avai_num int
)

Remplir le tableau avec des données :

insérer dans @scavai(avai_Key, avai_dat, avai_num)
    sélectionner 1, cast('2016-01-01' as date), 3
    union all
    sélectionner 1, cast('2016-01-02' as date), 2
    union all
    sélectionner 1, cast('2016-01-03' as date), 5
    union all
    sélectionner 1, cast('2016-01-04' as date), 6
    union all
    sélectionner 1, cast('2016-01-05' as date), 1
    union all
    sélectionner 1, cast('2016-01-06' as date), 8
    union all
    sélectionner 1, cast('2016-01-07' as date), 4
    union all
    sélectionner 1, cast('2016-01-08' as date), 3
    union all
    sélectionner 1, cast('2016-01-09' as date), 2
    union all
    sélectionner 1, cast('2016-01-10' as date), 1
    union all
    sélectionner 1, cast('2016-01-11' as date), 9
    union all
    sélectionner 1, cast('2016-01-12' as date), 7
    union all
    sélectionner 1, cast('2016-01-13' as date), 3
    union all
    sélectionner 1, cast('2016-01-14' as date), 8
    union all
    sélectionner 1, cast('2016-01-15' as date), 3
    union all
    sélectionner 1, cast('2016-01-16' as date), 2
    union all
    sélectionner 1, cast('2016-01-17' as date), 3
    union all
    sélectionner 1, cast('2016-01-18' as date), 1
    union all
    sélectionner 1, cast('2016-01-19' as date), 4
    union all
    sélectionner 1, cast('2016-01-20' as date), 5
    union all
    sélectionner 1, cast('2016-01-21' as date), 7
    union all
    sélectionner 1, cast('2016-01-22' as date), 3
    union all
    sélectionner 1, cast('2016-01-23' as date), 3
    union all
    sélectionner 1, cast('2016-01-25' as date), 3
    union all
    sélectionner 1, cast('2016-01-26' as date), 3

Je sais comment calculer le nombre de semaines dans la période donnée :

sélectionner DATEDIFF(ww, '2016-01-01', '2016-01-31')

Mais je ne sais pas comment calculer AVAI_NUM pour les jours ouvrables de chaque semaine et diviser cela par le nombre de jours de la semaine en particulier, puis résumer tout cela et diviser par le nombre de semaines ?

0 votes

Veillez à corriger AVG(avai_num) sur (partition par datepart(semaine, avai_dat) ordre par avai_dat)

0 votes

@nazark - pouvez-vous s'il vous plaît poster ceci comme réponse? (requête complète sur l'exemple si possible). Merci.

0 votes

Posté mais pas sûr du résultat que vous recherchez?

1voto

nazark Points 1153

Essayer,

select *,
    AVG(cast(avai_num as decimal)) over 
    (partition by datepart(week,  avai_dat) order by (select 1)) avg1
    from @scavai 
    where avai_dat between @dDateFrom and @dDateTo 
    order by avai_dat

0 votes

Merci pour les réponses, mais les résultats sont différents à l'intérieur de la journée de la semaine. Le résultat moyen devrait être le même pour chaque jour de la semaine.

0 votes

Merci beaucoup, cela fonctionne. Est-il possible d'avoir un résultat décimal pour la moyenne au lieu d'un entier ? AVAI_NUM est un entier, mais la moyenne est plus précise si elle est décimale (8,2).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X