Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос с нарастающим итогом / 5 сообщений из 5, страница 1 из 1
22.03.2018, 22:46
    #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
22.03.2018, 22:52
    #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
23.03.2018, 04:49
    #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
23.03.2018, 04:50
    #39619202
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с нарастающим итогом
execute,

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

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

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


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