powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Расчет накопительного итога по условию
3 сообщений из 3, страница 1 из 1
Расчет накопительного итога по условию
    #39927201
gart1976
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Прошу помочь разобраться с написанием запроса по следующей задаче.
Есть таблица оборота по карте клиента в день, где
Ow_id уникальный идентификатор клиента
Day Расчетный день
POS Оборот по карте

Например:
Ow_id Day POS
1 12.02.2016 2500
1 13.02.2016 1000
1 14.02.2016 700
2 12.02.2016 3000
2 13.02.2016 4500
2 14.02.2016 300

За каждую 1000 рублей клиенту начисляется 1 бонус. При этом, если клиент, например купил на 2500 руб. ему начислят 2 бонуса, а 500 рублей просуммируется к след покупке. Нужно написать скрипт, который считает начисленные бонусы на каждый день.
Необходимо реализовать скрипт с помощью оконных функций и рекурсии, т е 2 способами

Пока начал составлять с помощью оконных функции, но не слишком в них разбираюсь, получается примерно так

SELECT  Ow_id,  Day, POS,
floor(POS/1000) as b, -- кол-во бонусов за текущий день
POS - 1000*floor(POS/1000) as rest,   -- переходящий остаток для расчета бонусов на следующий день
SUM(POS- 1000*floor(POS/1000)) OVER (PARTITION BY Ow_id ORDER BY Day RANGE UNBOUNDED PRECEDING) -- остатки накопительным итогом
FROM Table
ORDER BY Ow_id,  Day;
...
Рейтинг: 0 / 0
Расчет накопительного итога по условию
    #39927248
gart1976
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо за помощь, разобрался сам!
Прилагаю решение, если кому-то будет интересно подобная задача.

Оконные ф-ции:

select Ow_id, Day, POS, floor(POS1/1000) as Bonus
from (select tg.*,
POS + coalesce(sum(tg.POS % 1000) over (partition by tg.Ow_id order by tg.Day
rows between unbounded preceding and 1 preceding), 0) as POS1
from table tg) NewTable
order by Ow_id, Day;

Рекурсия (подзапрос)

select Ow_id, Day, POS, floor(POS1/1000) as Bonus
from
(select g.*,
g.pos + (select coalesce(sum(t2.POS % 1000), 0)
from table3 t2
where g.Ow_id = t2.Ow_id and t2.Day < g.Day) as POS1
from table g) NewTable
order by Ow_id, Day;
...
Рейтинг: 0 / 0
Расчет накопительного итога по условию
    #39927264
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gart1976,

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


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