我的每月销售数据看起来像这样。(希望我可以画桌子,但不是让我把它放进去或者我不知道怎么做)
表中有两列日期和单位销售。日期只有一个月的第一天。但并非所有月份都有进入。所以它可能是3/1/2017有20个单位。那么4/1/2017没有排。 2017年5月1日有100个单位。
我需要计算最近3个月的平均值。但是几个月没有排。如何将缺失的月份纳入平均计算?我可以进行分组和平均分组,但这样可以省去计算中缺失的月份。
提前致谢。
答案 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