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

Откуда:
Сообщений: 33
Всем привет.
Очень нужна помощь. Есть таблица

Index_data | Sum
_____________________
20.10.2015 | 8
21.10.2015 | 2
22.10.2015 | 2
23.10.2015 | 5
24.10.2015 | 0
25.10.2015 | 0
26.10.2015 | 0

Как мне написать запрос, что бы вместо 0 выводилась сумма всех предыдущих элементов?
23 май 18, 15:42    [21432935]     Ответить | Цитировать Сообщить модератору
 Re: Сумма предыдущих значений  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
emolenev,

ну, если версия позволяет, то sum([sum]) over(order by Index_data)
если только вместо нуля, то еще в кейс обернуть
23 май 18, 15:44    [21432939]     Ответить | Цитировать Сообщить модератору
 Re: Сумма предыдущих значений  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
emolenev,

SUM(Sum) OVER (ORDER BY Index_data ROWS  UNBOUNDED PRECEDING)


чудно
 sum([sum]) over(order by Index_data)
23 май 18, 15:45    [21432945]     Ответить | Цитировать Сообщить модератору
 Re: Сумма предыдущих значений  [new]
emolenev
Member

Откуда:
Сообщений: 33
Получается не совсем то:
Index_data | Sum
_____________________
20.10.2015 | 8
21.10.2015 | 2
22.10.2015 | 2
23.10.2015 | 5
24.10.2015 | 17
25.10.2015 | 17
26.10.2015 | 17

А необходимо каждый последующий элемент это сумма предыдущих:
Index_data | Sum
_____________________
20.10.2015 | 8
21.10.2015 | 2
22.10.2015 | 2
23.10.2015 | 5
24.10.2015 | 17
25.10.2015 | 34
26.10.2015 | 68
23 май 18, 15:54    [21432972]     Ответить | Цитировать Сообщить модератору
 Re: Сумма предыдущих значений  [new]
emolenev
Member

Откуда:
Сообщений: 33
TaPaK
emolenev,

SUM(Sum) OVER (ORDER BY Index_data ROWS  UNBOUNDED PRECEDING)


чудно
 sum([sum]) over(order by Index_data)


Получается не совсем то:
Index_data | Sum
_____________________
20.10.2015 | 8
21.10.2015 | 2
22.10.2015 | 2
23.10.2015 | 5
24.10.2015 | 17
25.10.2015 | 17
26.10.2015 | 17

А необходимо каждый последующий элемент это сумма предыдущих:
Index_data | Sum
_____________________
20.10.2015 | 8
21.10.2015 | 2
22.10.2015 | 2
23.10.2015 | 5
24.10.2015 | 17
25.10.2015 | 34
26.10.2015 | 68
23 май 18, 15:57    [21432982]     Ответить | Цитировать Сообщить модератору
 Re: Сумма предыдущих значений  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
emolenev,
слова расходятся с делом?
автор
каждый последующий элемент это сумма предыдущих:

автор
20.10.2015 | 8
21.10.2015 | 2
22.10.2015 | 2
23.10.2015 | 5
24.10.2015 | 17
25.10.2015 | 34
26.10.2015 | 68
23 май 18, 16:06    [21433022]     Ответить | Цитировать Сообщить модератору
 Re: Сумма предыдущих значений  [new]
emolenev
Member

Откуда:
Сообщений: 33
TaPaK
emolenev,
слова расходятся с делом?
автор
каждый последующий элемент это сумма предыдущих:

автор
20.10.2015 | 8
21.10.2015 | 2
22.10.2015 | 2
23.10.2015 | 5
24.10.2015 | 17
25.10.2015 | 34
26.10.2015 | 68


Я просто в первом сообщении написал, что если 0 то сумма предыдущих элементов.
23 май 18, 16:08    [21433031]     Ответить | Цитировать Сообщить модератору
 Re: Сумма предыдущих значений  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Рекурсивным CTE можно...
23 май 18, 16:12    [21433048]     Ответить | Цитировать Сообщить модератору
 Re: Сумма предыдущих значений  [new]
emolenev
Member

Откуда:
Сообщений: 33
Как написать запрос?
23 май 18, 16:19    [21433085]     Ответить | Цитировать Сообщить модератору
 Re: Сумма предыдущих значений  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
emolenev,
если в одну дату не может быть несколько записей, то как-нибудь так
with b as(
select index_data
      ,sum
      ,sum(case when sum=0 then 1 else 0 end)over(order by index_data rows unbounded preceding)r
  from your_table
)
select index_data,case sum 
                       when 0
                       then (select sum(c.sum*(b.r-c.r))
                               from b c
                              where c.index_data<b.index_data)
                       else sum
                  end
  from b                        

если могут быть, то сначала бы определиться в каком порядке их брать
23 май 18, 16:23    [21433108]     Ответить | Цитировать Сообщить модератору
 Re: Сумма предыдущих значений  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
emolenev,

DECLARE @a TABLE (a date, b int)
INSERT INTO @a (a,b) VALUES
('20 nov 2015' , 8),
('21 nov 2015' , 2),
('22 nov 2015' , 2),
('23 nov 2015' , 5),
('24 nov 2015' , 0),
('25 nov 2015' , 0),
('26 nov 2015' , 0)

;WITH  x as 
(
	SELECT
		a,b	
	FROM @a
	WHERE b <> 0	
	
	UNION ALL

	SELECT 
		y.a,	x.b
	FROM @a	 y	
	INNER JOIN x
	ON	x.a < y.a
	WHERE y.b = 0
	
	
)
SELECT a,SUM(b) 
FROM x
GROUP BY a
ORDER BY a
23 май 18, 16:25    [21433119]     Ответить | Цитировать Сообщить модератору
 Re: Сумма предыдущих значений  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
Посетитель,

а не, косяк. мой вариант не катит в таком виде.
23 май 18, 16:30    [21433146]     Ответить | Цитировать Сообщить модератору
 Re: Сумма предыдущих значений  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
Посетитель,
Скорее как то так, проверить не могу, у меня лапки
with b as(
select index_data
      ,sum
      ,sum(case when sum=0 then 1 else 0 end)over(order by index_data rows unbounded preceding)r
  from t1
)
select index_data,case sum 
                       when 0
                       then (select sum(s)
                               from (select c.sum*power(2,b.r-c.r-1)
                                       From b c
                                      where c.index_data<b.index_data) c(s)) 
                       else sum
                  end
  from b 
23 май 18, 17:44    [21433461]     Ответить | Цитировать Сообщить модератору
 Re: Сумма предыдущих значений  [new]
emolenev
Member

Откуда:
Сообщений: 33
TaPaK, спасибо. А если изменить задачу следующим образом: найти не сумму всех предыдущих а среднее значение.
24 май 18, 19:30    [21437887]     Ответить | Цитировать Сообщить модератору
 Re: Сумма предыдущих значений  [new]
emolenev
Member

Откуда:
Сообщений: 33
TaPaK,

И каждое среднее умножать на коэффициент. Соответственно следующее среднее будет от ненулеввх значений и среднего*на коэффициент
24 май 18, 19:49    [21437954]     Ответить | Цитировать Сообщить модератору
 Re: Сумма предыдущих значений  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
emolenev,
+

Картинка с другого сайта.
25 май 18, 09:06    [21438882]     Ответить | Цитировать Сообщить модератору
 Re: Сумма предыдущих значений  [new]
emolenev
Member

Откуда:
Сообщений: 33
TaPaK,
)) Извини, надо было сразу попросить. Буду очень признателен.
25 май 18, 09:27    [21438966]     Ответить | Цитировать Сообщить модератору
 Re: Сумма предыдущих значений  [new]
emolenev
Member

Откуда:
Сообщений: 33
TaPaK,

Сможешь помочь?
25 май 18, 11:02    [21439371]     Ответить | Цитировать Сообщить модератору
 Re: Сумма предыдущих значений  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
emolenev
TaPaK,

Сможешь помочь?

у меня лапки и пятница
25 май 18, 11:03    [21439380]     Ответить | Цитировать Сообщить модератору
 Re: Сумма предыдущих значений  [new]
emolenev
Member

Откуда:
Сообщений: 33
Посетитель, твой вариант тоже работает :)
Спасибо. А если изменить задачу следующим образом: если 0 найти не сумму всех предыдущих а среднее значение. И каждое среднее умножать на коэффициент. Соответственно следующее среднее будет от ненулевых значений и среднего*на коэффициент

Index_data | Sum |koef
_____________________
20.10.2015 | 8 | 1.2
21.10.2015 | 2 | 0.8
22.10.2015 | 2 | 0.5
23.10.2015 | 5 |1.29
24.10.2015 | 0 | 1.31
25.10.2015 | 0 |1.24
26.10.2015 | 0 |1.6

получится ряд
8, 2, 2, 5 , среднее(8+2+2+5)*1.31, среднее(8+2+2+5+среднее(8+2+2+5)*1.31)*1.24 и так далее
25 май 18, 14:32    [21440418]     Ответить | Цитировать Сообщить модератору
 Re: Сумма предыдущих значений  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
emolenev,

а у меня еще со среды лапки.
25 май 18, 14:37    [21440447]     Ответить | Цитировать Сообщить модератору
 Re: Сумма предыдущих значений  [new]
emolenev
Member

Откуда:
Сообщений: 33
Народ, кто-нибудь может еще помочь?
25 май 18, 14:51    [21440511]     Ответить | Цитировать Сообщить модератору
 Re: Сумма предыдущих значений  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7758
emolenev,

причем здесь ноль и сумма предыдущих значений? У Вас кривая архитектура данных. В реляционной базе значения атрибутов не зависят друг от друга ни по вертикали, ни по горизонтали. А как Вы их там умножать будете - забота клиентского приложения, работающего с массивами.
25 май 18, 18:30    [21441462]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить