powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос с нарастающим итогом
5 сообщений из 5, страница 1 из 1
Запрос с нарастающим итогом
    #39619157
execute
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Прошу помощи с запросом.

Есть такие вот тестовые данные:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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, полученного в предыдущей строке.
Надеюсь понятно объяснил.
Курсором/циклом решить могу. Но может кто-то знает решение одним запросом.
Заранее спасибо!
...
Рейтинг: 0 / 0
Запрос с нарастающим итогом
    #39619161
execute
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
execute,

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

Код: sql
1.
2.
3.
4.
case when ceiling( abs( -15000 ) / p ) < floor( r )
                    then ceiling( abs( -15000 ) / p )
                    else floor( r )  * p
     end as calc


для второй
Код: sql
1.
2.
3.
4.
case when ceiling( abs( -12165.00) / p ) < floor( r )
                    then ceiling( abs( -12165.00) / p )
                    else floor( r )  * p
     end as calc



и так далее
...
Рейтинг: 0 / 0
Запрос с нарастающим итогом
    #39619201
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
execute,

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
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
...
Рейтинг: 0 / 0
Запрос с нарастающим итогом
    #39619202
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
execute,

Задача сводится к реализации максимума товара в указанную сумму исходя из имеющихся остатков и цен?
...
Рейтинг: 0 / 0
Запрос с нарастающим итогом
    #39619249
execute
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kopelly,

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

Рекурсивное cte вчера тоже написал. Почему то казалось что можно обойтись оконными функциями.
Сиквел кстати 2016
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос с нарастающим итогом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]