Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Нарастающий итог  [new]
IDVT
Member

Откуда:
Сообщений: 320
Сдрасти, что-то мне не нравится мой способ решения, с оконками еще не столь тесно знаком, может есть способ уйти от Union

задача: Есть общая таблица, содержит остатки на начало месяца (OrderBy = 0) и движение (OrderBy = 1), мне необходимо рассчитать нарастающий итог по каждому месяцу в разрезе товара. В данной таблице могут содержаться пропуски движения, ими можно пренебречь (т.е. остаток на конец месяца может отличаться от остатка на начало месяца).

Declare @Balance table ( DimDate    Date
                       , DimProduct Char(3)
                       , OrderBy    Bit
                       , Qty        int )
Declare @DimDate table ( DimDate    Date )
Declare @BeginDate date = '20160501'

While @BeginDate <= '20160610'
begin
      insert into @DimDate select @BeginDate
      set @BeginDate = DateAdd ( day
                               , 1 
                               , @BeginDate)
end

Insert into @Balance
      select '20160501', 'p1', 0, 955
Union select '20160502', 'p1', 1, -15
Union select '20160505', 'p1', 1, -30
Union select '20160506', 'p1', 1, 60
Union select '20160508', 'p1', 1, 10
Union select '20160510', 'p1', 1, 5
Union select '20160511', 'p1', 1, 80
Union select '20160601', 'p1', 0, 1002
Union select '20160604', 'p1', 1, -60
Union select '20160608', 'p1', 1, 40

Union select '20160501', 'p2', 0, 345
Union select '20160503', 'p2', 1, -15
Union select '20160505', 'p2', 1, -30
Union select '20160506', 'p2', 1, 60
Union select '20160509', 'p2', 1, 10
Union select '20160514', 'p2', 1, 5
Union select '20160518', 'p2', 1, 80
Union select '20160601', 'p2', 0, 392
Union select '20160607', 'p2', 1, -60
Union select '20160609', 'p2', 1, 40

Select NI.DimDate
     , NI.DimProduct
	 , NI.tot_sum 
	  +  ( select top 1 bl.Qty
           from @Balance as bl
		   where  bl.DimProduct = NI.DimProduct
               and bl.DimDate <= NI.DimDate
               and bl.OrderBy = 0
         order by bl.DimDate desc) as qty
from ( select DimDate
            , DimProduct
            , tot_sum = sum(Qty) over ( partition by EoMonth( DimDate)
                                                   , DimProduct 
                                                   order by DimDate asc)
       from @Balance
       where OrderBy = 1)NI
Union 
Select DimDate
     , DimProduct
	 , qty
from @Balance
where OrderBy = 0
28 окт 16, 13:20    [19833311]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог  [new]
IDVT
Member

Откуда:
Сообщений: 320
таблица @DimDate. пока не в тему, забыл убрать...
28 окт 16, 13:21    [19833322]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
select DimDate
		,DimProduct
		,sum(qty) over(partition by datepart(month,DimDate),DimProduct order by DimDate) as qty
 from @Balance
28 окт 16, 14:28    [19833847]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог  [new]
IDVT
Member

Откуда:
Сообщений: 320
Спасибо!
28 окт 16, 14:58    [19834007]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить