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

Откуда: Москва
Сообщений: 496
Ребят, знаю как через курсор, но долго, да и курсор не охота использовать
Необходимо складывать предыдущие строки и когда сумма будет равна или больше единицы, записать значение целого числа.
Во вложение файл

Модератор: Вложение удалено.


Сообщение было отредактировано: 24 сен 18, 14:36
24 сен 18, 14:33    [21684071]     Ответить | Цитировать Сообщить модератору
 Re: MSQL зависимость расчета от предыдущей строки  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36687
Во вложении было вот это:

К сообщению приложен файл. Размер - 30Kb
24 сен 18, 14:36    [21684078]     Ответить | Цитировать Сообщить модератору
 Re: MSQL зависимость расчета от предыдущей строки  [new]
Focha
Member

Откуда: Москва
Сообщений: 496
Гавриленко Сергей Алексеевич
Во вложении было вот это:

Спасибо

Вот добавил еще столбцы, может так будет понятней

К сообщению приложен файл. Размер - 22Kb
24 сен 18, 14:43    [21684097]     Ответить | Цитировать Сообщить модератору
 Re: MSQL зависимость расчета от предыдущей строки  [new]
court
Member

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

пронумеровать row-number-ом, и потом рекурсивным СТЕ, - будет проще всего
;with cte as (
	select
		[buffer]=case when [plan]>=1 then 0 else [plan] end
		,plan_smalli=case when [plan]>=1 then floor([plan]) end
		, ... 
	from T 
	where rn=1
	
	union all
	
	select
		[buffer]=case when cte.[buffer]+T.[plan]>=1 then 0 else cte.[buffer]+T.[plan] end
		,plan_smalli=case when cte.[buffer]+T.[plan]>=1 then floor(cte.[buffer]+T.[plan]) end
		, ...
	from cte inner join T on cte.rn=T.rn-1)
select * from cte order by rn 
24 сен 18, 14:50    [21684120]     Ответить | Цитировать Сообщить модератору
 Re: MSQL зависимость расчета от предыдущей строки  [new]
iiyama
Member

Откуда:
Сообщений: 642
Focha,
Немного офф,
Смешанные ощущения, вроде вы не новичек и писать Вам про скрипты создания и заполнения данными-лишнее с другой стороны ни того ни даже версии сервера не видно, чуднО

А по теме- нарастающий итог давно считается без курсоров, посмотреть "предыдущее" значение с явным определенным порядком тоже не проблема
24 сен 18, 14:50    [21684121]     Ответить | Цитировать Сообщить модератору
 Re: MSQL зависимость расчета от предыдущей строки  [new]
Посетитель
Member

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

with a as
    (select * from(values(201908,0.298645),(201907,0.395862),(201906,0.496441),(201905,0.594498),(201904,0.613721),(201903,0.72629)
                        ,(201902,0.819897),(201901,1.184565))a(a,b))
select *,case when floor(c)>floor(c-b) then floor(c)-floor(c-b) end d
  from (select *,sum(b)over(order by a desc rows between unbounded preceding and current row) c
          from a)b
24 сен 18, 14:53    [21684125]     Ответить | Цитировать Сообщить модератору
 Re: MSQL зависимость расчета от предыдущей строки  [new]
Focha
Member

Откуда: Москва
Сообщений: 496
iiyama
Focha,
Немного офф,
Смешанные ощущения, вроде вы не новичек и писать Вам про скрипты создания и заполнения данными-лишнее с другой стороны ни того ни даже версии сервера не видно, чуднО

А по теме- нарастающий итог давно считается без курсоров, посмотреть "предыдущее" значение с явным определенным порядком тоже не проблема


Версия:
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4297.0 (X64)
24 сен 18, 14:55    [21684132]     Ответить | Цитировать Сообщить модератору
 Re: MSQL зависимость расчета от предыдущей строки  [new]
Focha
Member

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

with a as
    (select * from(values(201908,0.298645),(201907,0.395862),(201906,0.496441),(201905,0.594498),(201904,0.613721),(201903,0.72629)
                        ,(201902,0.819897),(201901,1.184565))a(a,b))
select *,case when floor(c)>floor(c-b) then floor(c)-floor(c-b) end d
  from (select *,sum(b)over(order by a desc rows between unbounded preceding and current row) c
          from a)b


Да, крутая штука, но увы я ранее не указал версию сервера, в моей версии 2008 это не работает
24 сен 18, 15:00    [21684144]     Ответить | Цитировать Сообщить модератору
 Re: MSQL зависимость расчета от предыдущей строки  [new]
Посетитель
Member

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

with a as
    (select * from(values(201908,0.298645),(201907,0.395862),(201906,0.496441),(201905,0.594498),(201904,0.613721),(201903,0.72629)
                        ,(201902,0.819897),(201901,1.184565))a(a,b))
select *,case when floor(c)>floor(c-b) then floor(c)-floor(c-b) end d
  from (select *,sum(b)over(order by a desc rows between unbounded preceding and current row) c
          from a)b



Да, крутая штука, но увы я ранее не указал версию сервера, в моей версии 2008 это не работает


Вы не знаете, как реализовать нарастающий итог в 2008?
24 сен 18, 15:01    [21684149]     Ответить | Цитировать Сообщить модератору
 Re: MSQL зависимость расчета от предыдущей строки  [new]
TaPaK
Member

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

with a as
    (select * from(values(201908,0.298645),(201907,0.395862),(201906,0.496441),(201905,0.594498),(201904,0.613721),(201903,0.72629)
                        ,(201902,0.819897),(201901,1.184565))a(a,b))
select *,case when floor(c)>floor(c-b) then floor(c)-floor(c-b) end d
  from (select *,sum(b)over(order by a desc rows between unbounded preceding and current row) c
          from a)b


Да, крутая штука, но увы я ранее не указал версию сервера, в моей версии 2008 это не работает

гугл - накопительный итог, даст варианты на любой sql
24 сен 18, 15:01    [21684150]     Ответить | Цитировать Сообщить модератору
 Re: MSQL зависимость расчета от предыдущей строки  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2374
https://www.sql.ru/forum/128516/top-10-samyh-populyarnyh-voprosov

первая тема
24 сен 18, 15:19    [21684186]     Ответить | Цитировать Сообщить модератору
 Re: MSQL зависимость расчета от предыдущей строки  [new]
Focha
Member

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

with a as
    (select * from(values(201908,0.298645),(201907,0.395862),(201906,0.496441),(201905,0.594498),(201904,0.613721),(201903,0.72629)
                        ,(201902,0.819897),(201901,1.184565))a(a,b))
select *,case when floor(c)>floor(c-b) then floor(c)-floor(c-b) end d
  from (select *,sum(b)over(order by a desc rows between unbounded preceding and current row) c
          from a)b

Спасибо!
24 сен 18, 15:21    [21684190]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить