2016-12-17 6 views
1

Привет Я новичок, когда дело дошло до SQL, и надеялся, что кто-то сможет мне помочь в этом вопросе. Я использовал функцию задержки здесь и там, но мне было интересно, есть ли способ переписать ее, чтобы превратить ее в диапазон сумм. Поэтому вместо одного месяца я хочу взять предыдущие 12 месяцев и суммировать их вместе для каждого периода. Я не хочу писать 12 строк задержки, но задавался вопросом, есть ли способ получить это с меньшим количеством строк кода. Обратите внимание, что будут нули, и если одно из 12 записей равно null, оно должно быть нулевым.Диапазон добавления функций SQL Server Lag

enter image description here

Я знаю, что вы можете написать записи подзапрос, чтобы сделать это, но было интересно, если это возможно. Любая помощь приветствуется.

+0

Вы, вероятно, хотите сумму() над (раздел по левой стороне (период, 4) order by period) – scsimon

+0

Какую версию 'Sql Server' вы используете? –

+0

У вас обязательно есть строка для каждого месяца, или вам могут быть недостающие строки? –

ответ

1

Вы хотите, чтобы «оконная рамка» была частью функции окна. Движущийся 12 месяцев в среднем будет выглядеть так:

select t.*, 
     sum(balance) over (order by period rows between 11 preceding and current row) as moving_sum_12 
from t; 

Вы можете просмотреть оконные рамы в documentation.

Если вы хотите получить суммарную сумму, вы можете полностью опустить рамку окна.

Я хотел бы отметить, что вы можете сделать это с помощью lag(), но это намного сложнее:

select t.*, 
     (balance + 
     lag(balance, 1, 0) over (order by period) + 
     lag(balance, 2, 0) over (order by period) + 
     . . . 
     lag(balance, 11, 0) over (order by period) + 
     ) as sum_1112 
from t; 

Это использует малоизвестный третий аргумент lag(), который является значением по умолчанию для использования при записи недоступно. Он заменяет coalesce().

EDIT:

Если вы хотите NULL, если 12 значений не доступны, а затем использовать case и count(), а также:

select t.*, 
     (case when count(*) over (order by period rows between 11 preceding and current row) = 12 
      then sum(balance) over (order by period rows between 11 preceding and current row) 
     end) as moving_sum_12 
from t; 
+0

Но что, если одна из строк равна нулю? Я думаю, что метод будет пропускать и принимать следующее ненулевое значение. Я хочу, чтобы он включал null, и набор результатов был бы нулевым, так как у вас на самом деле не было 12 месяцев данных. –

+0

Он игнорирует значение. –

+0

Должно быть 'count (balance)' вместо 'count (*)' –

 Смежные вопросы

  • Нет связанных вопросов^_^