2015-09-15 9 views
1

В следующем коде я пытаюсь вычислить скользящую среднюю каждого месяца по сравнению с последними 6 месяцами. Однако SQL исключает строки, которые являются нулевыми в знаменателе для среднего значения.Использование {Ряд предшествующих} для скользящего среднего sql

Для примера: -

Допустим, средний (COUNT (*)) для сентября 4, а значения с марта по август 0.In мой код, SQL принимает 4/1, но мне нужно его включить в предыдущие месяцы, даже если они не имеют значений (4/6).

select [Name],[Report Month] 
,avg(count(*)) over (partition by [Name] 
           order by [Report Month] 
           ROWS 5 PRECEDING) 
FROM dbo.Sample 
group by [Name],[Report Month] 

По suggestion.I Tab пытался создать таблицу месяца, чтобы их оставили вместе с dbo.sample, я не знаком с созданием месяца таблицы, поэтому я использовал интернет-ресурс, Ниже коду. (Я использую SQLServer2014, он сказал в ресурсе, код для 2000)

CREATE TABLE CalendarMonths (
    date DATETIME, 
    PRIMARY KEY (date) 
) 

DECLARE 
    @basedate DATETIME, 
    @offset INT 
SELECT 
    @basedate = '01 Jan 2000', 
    @offset = 1 

WHILE (@offset < 2048) 
BEGIN 
    INSERT INTO CalendarMonths SELECT DATEADD(MONTH, @offset, date) FROM CalendarMonths 
    SELECT @offset = @offset + @offset 
END 

Вы помощь очень ценится !! .. Спасибо заранее.

Бест,

+0

Вставить правую часть 'dbo.Sample' в таблицу месяца. –

+0

Привет, спасибо. Можете ли вы подробно остановиться? –

+0

Я попытался создать таблицу месяца, но он показывает 0 строк, затронутых. Можете ли вы поделиться своим запросом? –

ответ

1

Вы получили 0 затронутых строк, потому что вы сделали INSERT ... SELECT из пустой таблицы.

Он должен работать, если заменить это:

INSERT INTO CalendarMonths SELECT DATEADD(MONTH, @offset, date) FROM CalendarMonths 
SELECT @offset = @offset + @offset 

с этим:

INSERT INTO CalendarMonths SELECT DATEADD(MONTH, @offset, @basedate) 
SET @offset = @offset + 1 

Тогда присоединиться к этому месяцу таблицу на месяц, и только год, как это:

select [Name],cm.[date] AS ReportMonth 
,avg(count(*)) over (partition by [Name] 
           order by cm.[date] 
           ROWS 5 PRECEDING) 
FROM dbo.Sample s 
RIGHT OUTER JOIN CalendarMonths cm 
    ON MONTH(s.[Report Month])=MONTH(cm.[date]) 
    AND YEAR(s.[Report Month])=YEAR(cm.[date]) 

group by [Name],cm.[date] 
+0

Спасибо, я попробую и дам вам знать. –

+0

Это было действительно полезно. Tab. Но таблица календарного месяца сгенерировала даты только с 1-го числа каждого месяца (01-01,02-01 и т. Д.). Даты в dbo.sample (01-01,02-02,03-03 и т. Д.) .. Следовательно, появляется только 1-й день месяца. . Как я могу включить все даты в месяц? –

+0

отредактировано, чтобы показать присоединиться. –