#sql #oracle
Как мне это реализовать? Мне нужна сумма всех значений из столбца PPLAN, и из этой суммы нужно отнять значение PPLAN. Допустим, вся сумма = 89 473,79. На первой строке будет значение 89473,79 - 2182,29 = 87291.5, на второй будет 89473,79 - 2182,29 - 2182,29 = 85109.21 и т.д., пока не будет уже в конце 0. Количество строк всегда разное, т.к. это зависит обычно от периода месяцев, может быть 20 или 40, к примеру. Поэтому решил отталкиваться от всей суммы. Как мне можно поставить счетчик? Или сама логика решения задачи некорректна?
Ответы
Ответ 1
Я бы такое предложил: select sum(pplan) over () - sum(pplan) over (order by duedate) from mytable Первое sum(pplan) over () - это просто полная сумма, а sum(pplan) over (order by duedate) - это сумма с накоплением, соответственно, у вас в каждой следующей строке будут значения 89473,79, 89473,79 - 2182,29, 89473,79 - 2182,29 - 2182,29 и так далее.Ответ 2
Фактически вам нужна сумма всех последующих строк относительно текущей в указанной сортировке. Так что можно ничего не вычитать и получить сумму прямо по требуемому диапазону строк: select T.*, nvl( sum(pplan) over(order by duedate rows between 1 following and unbounded following) ,0) from Table T В последней строке возвращается NULL т.к. следующей 1 строки уже нет, превращаем его в 0 с помощью nvl. Информацию по работе предложения over() можно найти в документации по аналитическим функциям Oracle
Комментариев нет:
Отправить комментарий