Afin d'éliminer le biais introduit par les différences de nombre de jours dans les mois et les années (dans le cas des années bissextiles), à partir des comparaisons mensuelles totales de quantités arbitraires et en supposant, par exemple, une table nommée My_Table
avec une colonne datetime nommée order_date
, et un entier un nommé revenue
, j'utilise la requête suivante pour obtenir impartiales totaux des revenus mensuels:Supprimer le biais des totaux mensuels
-- sum revenue per month, divided by the number of days of that month
-- and then multiplied by the average days of the that year's months
SELECT datepart(mm,order_date) as my_month, sum(
round(convert(decimal, revenue)/
CASE WHEN MONTH(order_date) = 2 THEN
CASE WHEN (YEAR(order_date) % 4 = 0 AND YEAR(order_date) % 100 != 0) OR
(YEAR(order_date) % 400 = 0) THEN 29 ELSE 28 END
WHEN (MONTH(order_date)%8 + floor(MONTH(order_date)/8)) % 2 = 0 THEN 30 ELSE 31 END
* CASE WHEN (YEAR(order_date) % 4 = 0 AND YEAR(order_date) % 100 != 0) OR
(YEAR(order_date) % 400 = 0) THEN 366 ELSE 365 END/12 , 3)
) as monthly_unb_revenue
FROM My_Table
group by datepart(mm,order_date)
Je voudrais vos opinions ou d'autres pratiques
Juste curieux, est-ce pour un système de base de données particulier? Des fonctions disponibles uniquement peuvent aider. –
oui, en fait, c'est une requête sybase - j'ai oublié de préciser que :) –