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

Есть такие вот тестовые данные:
declare @t table ( i int identity(1,1), r numeric( 18, 2 ), p numeric( 18, 2 ) );

insert into @t ( r, p )  values
( 50.00, 56.7 ), ( 200.00, 57.89 ), ( 500, 45.62 ), ( 3.00, 181.80 );

declare @money int = -15000;

;with cte as (
select @money as money, *     
  from @t )
, cte2 as (
select *, case when ceiling( abs( money ) / p ) < floor( r )
                    then ceiling( abs( money ) / p )
                    else floor( r )  * p
     end as calc

  from cte
)
select *, sum( calc ) over ( order by i )
  from cte2


Но этот запрос не совсем корректный: поле "calc" необходимо считать не в зависимости от поля money, а в зависимости от того, какое значение было получено в предыдущей строке ( сортировка по i ) в поле calc
Т.е. есть money в первой строке, мы их сложили с calc, и в последующих строках calc нужно считать не в зависимости от поля money, а из поля money+calc, полученного в предыдущей строке.
Надеюсь понятно объяснил.
Курсором/циклом решить могу. Но может кто-то знает решение одним запросом.
Заранее спасибо!
22 мар 18, 22:46    [21279026]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с нарастающим итогом  [new]
execute
Guest
execute,

Например для первой строки

case when ceiling( abs( -15000 ) / p ) < floor( r )
                    then ceiling( abs( -15000 ) / p )
                    else floor( r )  * p
     end as calc

для второй
case when ceiling( abs( -12165.00) / p ) < floor( r )
                    then ceiling( abs( -12165.00) / p )
                    else floor( r )  * p
     end as calc


и так далее
22 мар 18, 22:52    [21279042]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с нарастающим итогом  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
execute,

Используй рекурсию типа:

declare @t table ( i int identity(1,1), r numeric( 18, 2 ), p numeric( 18, 2 ) );

insert into @t ( r, p )  values
( 50.00, 56.7 ), ( 200.00, 57.89 ), ( 500, 45.62 ), ( 3.00, 181.80 );

declare @money int = -15000;

;with cte as (
select @money as money, *     
  from @t )
, cte2 as (
select *, case when ceiling( abs( money ) / p ) < floor( r )
                    then ceiling( abs( money ) / p )*p
                    else floor( r )  * p
     end as calc,
	 cast(money + case when ceiling( abs( money ) / p ) < floor( r )
                    then ceiling( abs( money ) / p )*p
                    else floor( r )  * p end as numeric( 18, 2 ))  as Ost

  from cte
  Where i=1
 union all 
select cte.*, case when ceiling( abs( cte2.ost) / cte.p ) < floor( cte.r )
                    then ceiling( abs( cte2.ost ) / cte.p )*cte.p
                    else floor( cte.r )  * cte.p 
     end as calc,
	 cast(cte2.ost+case when ceiling( abs( cte2.ost) / cte.p ) < floor( cte.r )
                    then ceiling( abs( cte2.ost ) / cte.p )*cte.p
                    else floor( cte.r )  * cte.p end as numeric( 18, 2 )) as Prev

  from cte2 join cte on cte.i = cte2.i+1
)
select *, sum( calc ) over ( order by i )
  from cte2
23 мар 18, 04:49    [21279252]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с нарастающим итогом  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
execute,

Задача сводится к реализации максимума товара в указанную сумму исходя из имеющихся остатков и цен?
23 мар 18, 04:50    [21279253]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с нарастающим итогом  [new]
execute
Guest
Kopelly,

Да, вы верно поняли постановку.
Но я бы уточнил -. "Исходя из имеющихся остатков, цен и указанной суммы, которая меняется, в зависимости от того сколько мы реализовали предыдущего ( сортировка по i )" товара

Рекурсивное cte вчера тоже написал. Почему то казалось что можно обойтись оконными функциями.
Сиквел кстати 2016
23 мар 18, 08:54    [21279436]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить