Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Непрерывный нарастающий итог  [new]
Пассажир паравоза
Guest
Коллеги добрый день. Есть запрос следующего вида.
declare @DS DATETIME = '2016-09-01'
declare @DE DATETIME = '2016-10-01'

DECLARE @TBL TABLE(
	DT		DATETIME,
	SUM1	MONEY
)
INSERT INTO @TBL(DT,SUM1) VALUES ( '2016-09-05', 50),( '2016-09-07', -10),( '2016-09-15', 150)
SELECT DT,SUM1,(SELECT SUM(SUM1) FROM @TBL t2 WHERE t2.DT <=t1.DT) FROM @TBL t1


Возвращает накопительный итог по дням, по которым было движение, необходимо по всем дня за интервал, помню это было как то просто. Сервер увы 2008 :(
6 окт 16, 17:14    [19751910]     Ответить | Цитировать Сообщить модератору
 Re: Непрерывный нарастающий итог  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2415
Пассажир паравоза,

https://www.sql.ru/forum/128516/top-10-samyh-populyarnyh-voprosov
6 окт 16, 17:16    [19751922]     Ответить | Цитировать Сообщить модератору
 Re: Непрерывный нарастающий итог  [new]
Пассажир паравоза
Guest
2StarikNavy И что мне должна дать Ваша ссылка ? Разве что отсыл к использованию ранжирующих функций.
6 окт 16, 17:19    [19751941]     Ответить | Цитировать Сообщить модератору
 Re: Непрерывный нарастающий итог  [new]
_human
Member

Откуда:
Сообщений: 569
Пассажир паравоза,

генерировать рекордсет всех необходимых дней, или создайте таблицу-календарь
дальше left join + running total
6 окт 16, 17:23    [19751972]     Ответить | Цитировать Сообщить модератору
 Re: Непрерывный нарастающий итог  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Пассажир паравоза,

чтобы было по всем дням, надо сджойниться со списком всех дней. его можно хранить или генерировать на лету разными способами - по вкусу.
6 окт 16, 17:24    [19751982]     Ответить | Цитировать Сообщить модератору
 Re: Непрерывный нарастающий итог  [new]
Пассажир паравоза
Guest
Ага, то видимо была какая то другая задача :), что с днями джойнить по понятно :), в любом случае спасибо.
6 окт 16, 17:26    [19751997]     Ответить | Цитировать Сообщить модератору
 Re: Непрерывный нарастающий итог  [new]
Last non NULL,
Guest
http://sqlmag.com/t-sql/last-non-null-puzzle
declare @DS DATETIME = '2016-09-01'
declare @DE DATETIME = '2016-10-01'

DECLARE @TBL TABLE(
	DT		DATETIME,
	SUM1	MONEY
)
INSERT INTO @TBL(DT,SUM1) VALUES ( '2016-09-05', 50),( '2016-09-07', -10),( '2016-09-15', 150)

--SELECT DT,SUM1,(SELECT SUM(SUM1) FROM @TBL t2 WHERE t2.DT <=t1.DT) FROM @TBL t1

-------------------------------------------------------------
;with cte as 
		(select DT, SUM1
				,S		=sum(SUM1)over(order by DT)
		from @TBL),
Calendar as 
		(select 
				D=cast(D as date) 
		from (values ('20160905'),('20160906'),('20160907'),('20160908'),('20160909'),('20160910'),('20160911'),('20160912'),('20160913'),('20160914'),('20160915')) as T(D)),
cte2 as (
		select 
				c.D, cte.SUM1, cte.S
				,grp =max(case when cte.S is not null then c.D end)over(order by D ROWS UNBOUNDED PRECEDING)
		from Calendar c
		left join cte on c.D=cte.DT)

select 
	 D
	,SUM1
	,S	=MAX(S) OVER(PARTITION BY grp ORDER BY D ROWS UNBOUNDED PRECEDING)	 
from cte2 
6 окт 16, 18:01    [19752166]     Ответить | Цитировать Сообщить модератору
 Re: Непрерывный нарастающий итог  [new]
o-o
Guest
Last non NULL,
http://sqlmag.com/t-sql/last-non-null-puzzle
declare @DS DATETIME = '2016-09-01'
declare @DE DATETIME = '2016-10-01'

DECLARE @TBL TABLE(
	DT		DATETIME,
	SUM1	MONEY
)
INSERT INTO @TBL(DT,SUM1) VALUES ( '2016-09-05', 50),( '2016-09-07', -10),( '2016-09-15', 150)

--SELECT DT,SUM1,(SELECT SUM(SUM1) FROM @TBL t2 WHERE t2.DT <=t1.DT) FROM @TBL t1

-------------------------------------------------------------
;with cte as 
		(select DT, SUM1
				,S		=sum(SUM1)over(order by DT)
		from @TBL),
Calendar as 
		(select 
				D=cast(D as date) 
		from (values ('20160905'),('20160906'),('20160907'),('20160908'),('20160909'),('20160910'),('20160911'),('20160912'),('20160913'),('20160914'),('20160915')) as T(D)),
cte2 as (
		select 
				c.D, cte.SUM1, cte.S
				,grp =max(case when cte.S is not null then c.D end)over(order by D ROWS UNBOUNDED PRECEDING)
		from Calendar c
		left join cte on c.D=cte.DT)

select 
	 D
	,SUM1
	,S	=MAX(S) OVER(PARTITION BY grp ORDER BY D ROWS UNBOUNDED PRECEDING)	 
from cte2 

У него 2008ой сервер
6 окт 16, 18:29    [19752314]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить