powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сослаться на предыдущее значение того же столбца
8 сообщений из 8, страница 1 из 1
Сослаться на предыдущее значение того же столбца
    #40099564
YoHnA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый!

Задачка: есть продукт (ID), есть дни, в которые этот продукт закупается (DayID), сколько должны отгрузить (Pln) и сколько по факту отгружено (Fct). Надо вычислить средневзвешенное по навороченной формуле с большим количеством case. Суть проблемы в том, что для этого агрегируются два поля, параметр (Par) и дельта (Delta)
И в каждой следующей строке надо учитывать результат предыдущей дельты, которая вычислилась по нагромождению кейсов, в кейсах следующей строки
Типа, если модуль дельты предыдущей строки меньше планируемой отгрузки в текущей строке, то вычти из плана этот модуль, иначе обнулить (вычисление параметра) (when abs(Delta_предыдущ)<Pln then Pln-abs(Delta_предыдущ) else 0)
Или если модуль дельты предыдущей строки больше или равен факту в текущей, то вычти из факта план и этот модуль, иначе обнулить (вычисление дельты) (when abs(Delta_предыдущ)>=Fct then Fct-Pln-abs(Delta_предыдущ) else 0)
Окно по продукту, шагаем по дням
Lag сам на себя ссылаться не умеет, он бегает только по какому-то существующему до этого геморроя полю (по плану там или по факту) или я может быть совершенно не умею им пользоваться
Отчаянно не хочу загонять все это в циклы и надеялась смочь в один запрос

Почти неделю голову ломаю, помогите, пожалуйста
...
Рейтинг: 0 / 0
Сослаться на предыдущее значение того же столбца
    #40099586
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YoHnA,

гуглите функцию LAG()

а про нарастающий итог почитайте про кляузу OVER()
...
Рейтинг: 0 / 0
Сослаться на предыдущее значение того же столбца
    #40099597
YoHnA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff, но у меня же написано, что Lag не подошел :(
А нарастающий - как мне переменную в рамках окна щелкать? Разве конструкция @x=case when 1=1 then 0 end over (partition by ID order by DayID) оживет?
...
Рейтинг: 0 / 0
Сослаться на предыдущее значение того же столбца
    #40099618
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YoHnA
День добрый!

Задачка: есть продукт (ID), есть дни, в которые этот продукт закупается (DayID), сколько должны отгрузить (Pln) и сколько по факту отгружено (Fct). Надо вычислить средневзвешенное по навороченной формуле с большим количеством case. Суть проблемы в том, что для этого агрегируются два поля, параметр (Par) и дельта (Delta)
И в каждой следующей строке надо учитывать результат предыдущей дельты, которая вычислилась по нагромождению кейсов, в кейсах следующей строки
Типа, если модуль дельты предыдущей строки меньше планируемой отгрузки в текущей строке, то вычти из плана этот модуль, иначе обнулить (вычисление параметра) (when abs(Delta_предыдущ)<Pln then Pln-abs(Delta_предыдущ) else 0)
Или если модуль дельты предыдущей строки больше или равен факту в текущей, то вычти из факта план и этот модуль, иначе обнулить (вычисление дельты) (when abs(Delta_предыдущ)>=Fct then Fct-Pln-abs(Delta_предыдущ) else 0)
Окно по продукту, шагаем по дням
Lag сам на себя ссылаться не умеет, он бегает только по какому-то существующему до этого геморроя полю (по плану там или по факту) или я может быть совершенно не умею им пользоваться
Отчаянно не хочу загонять все это в циклы и надеялась смочь в один запрос

Почти неделю голову ломаю, помогите, пожалуйста


Ни одна конструкция языка SQL не умеет "ссылаться на нечто, рассчитанное для предыдущей строки".
Так устроены реляционные базы данных. И это правильно.

В MS SQL есть исключение - рекурсивная кляуза with.
Это плохой путь.
Все ваши страдания решаются банальной накопительной суммой.
...
Рейтинг: 0 / 0
Сослаться на предыдущее значение того же столбца
    #40099641
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YoHnA
felix_ff, но у меня же написано, что Lag не подошел :(
А нарастающий - как мне переменную в рамках окна щелкать? Разве конструкция @x=case when 1=1 then 0 end over (partition by ID order by DayID) оживет?
Нарастающий итог - это
Код: sql
1.
SUM(...) OVER(PARTITION BY ... ORDER BY ...)

Читайте документацию и книжки всякие про это.
...
Рейтинг: 0 / 0
Сослаться на предыдущее значение того же столбца
    #40099648
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YoHnA,

[spoiler]
сорян, я невнимательно прочитал ваш вопрос.

ответ вам дал aleks222
[/sroiler]
...
Рейтинг: 0 / 0
Сослаться на предыдущее значение того же столбца
    #40099665
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff
YoHnA,

[spoiler]
сорян, я невнимательно прочитал ваш вопрос.

ответ вам дал aleks222
[/sroiler]

Между тем /сролер - эта пять. Даже фсе десять!
Такой тег обязательно должен быть на форуме! :-)
...
Рейтинг: 0 / 0
Сослаться на предыдущее значение того же столбца
    #40099682
YoHnA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо, решено рекурсией через CTEшку
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сослаться на предыдущее значение того же столбца
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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