SQL Server获得最近X个月的平均值,包括缺少的月份

时间:2018-04-20 14:01:23

标签: sql-server group-by average

我的每月销售数据看起来像这样。(希望我可以画桌子,但不是让我把它放进去或者我不知道怎么做)

表中有两列日期和单位销售。日期只有一个月的第一天。但并非所有月份都有进入。所以它可能是3/1/2017有20个单位。那么4/1/2017没有排。 2017年5月1日有100个单位。

我需要计算最近3个月的平均值。但是几个月没有排。如何将缺失的月份纳入平均计算?我可以进行分组和平均分组,但这样可以省去计算中缺失的月份。

提前致谢。

2 个答案:

答案 0 :(得分:0)

你可以用所有月份做一个cte,然后加入它。没有数据的任何月份都将为空,因此如果您发现计算不正确,则可能需要ISNULL()' d为0。

;with months AS (
SELECT CAST('2017-01-01' AS DATE) AS month_
UNION ALL
SELECT DATEADD(MONTH, 1, month_) 
FROM months
WHERE month_ <'2017-12-01'
)

SELECT 
DATEPART(QUARTER, m.month_) AS sale_quarter, --should be fine in SQL Server 2008
SUM(units_sold) AS units_sold

FROM months m

LEFT JOIN your_sales_table s
    ON s.date = m.month_

GROUP BY DATEPART(QUARTER, m.month_)

如果你需要一个自定义的3个月范围而不是正常的季度,只需稍微更改一下。

SELECT 
SUM(units_sold) AS units_sold

FROM months m

LEFT JOIN your_sales_table s
    ON s.date = m.month_

WHERE m.month_ IN ('2017-03-01','2017-04-01','2017-05-01')

答案 1 :(得分:0)

-- reference date to start data aggregation
declare @refDate date = '2017-04-27'
-- number of months to go back    
declare @LastMonthsN int = 3

如果您需要显示最近n个月的所有行:

;with
m as (
    select DATEADD(mm, DATEDIFF(mm, 0, @refdate)-_month+1, 0) _month
    from ( values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12)) x (_month)
    where _month<=@LastMonthsN
),
f as (
    select *
    from SalesData d
    where ref_month between dateadd(mm, -@LastMonthsN, @refDate) and dateadd(mm, 0, @refDate)
)
select _month, Isnull(qty, 0) qty
from m
left join f on _month = ref_month

如果您只需要平均期限:

;with
f as (
    select *
    from SalesData d
    where ref_month between dateadd(mm, -@LastMonthsN, @refDate) and dateadd(mm, 0, @refDate)
)
select avg(isnull(qty, 0)) periodAVG
from f