Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
Июнь 24, 2018, 11:09:25 pm

Автор Тема: Расчёт среднего остатка с учётом и без учёта нулевого остатка  (Прочитано 4716 раз)

Оффлайн Софья

  • Наставник
  • **
  • Сообщений: 71
  • Страна: 00
  • Рейтинг: +14/-0
    • Просмотр профиля
Всем добрый день.

Возникла новая задача. Начну по порядку.

Требуется рассчитать средний остаток, причём, двумя способами.Первый расчёт - в нём нужно учесть дни, когда остаток = 0. А второй расчёт не должен учитывать дни, когда остаток = 0.

Пример для наглядности:
Допустим, за 1 мая остаток 50 штук, за 2 мая – 30 штук, за 3 мая – 0 штук, за 4 мая – 20 штук. Фактически, при первом расчёте средний остаток будет равен (50+30+0+20)/4=25. А при втором расчёте - (50+30+0+20)/3=33,3.

Полагаю, суть ясна. Но я не могу представить реализацию данного, учитывая специфику расчётов значений в моём приложении.

У меня средний остаток рассчитывается с помощью Set Analysis вот такой конструкцией:num(sum({$ <DOC_DATE = {'>=$(=yearstart(date(min(DOC_DATE),-1)))<=$(=date(max(DOC_DATE)))'}, YEAR=, MONTH=, NUMBE=>} KOL)
-sum({$ <DOC_DATE = {'>=$(=yearstart(date(min(DOC_DATE),-1)))<=$(=date(max(DOC_DATE)))'}, YEAR=, MONTH=, NUMBE=>} KOL2), '# ##0,00')
где KOL – количество по приходным документам, а KOL2, соответственно, по расходным.

Формула AVG() не работает поверх данной конструкции. Дробление же её я не могу вообразить, т.к. только при помощи данной конструкции средний остаток верно рассчитывается.

Видела уже, что есть пост про расчёт среднего значения, прошу прощения за дублирование, но как применить эти формулы к моему синтаксису - я пока не понимаю.

Буду благодарна любой помощи, может, кто сталкивался с подобной задачей.



Оффлайн bibis

  • Наставник
  • **
  • Сообщений: 78
  • Рейтинг: +31/-0
    • Просмотр профиля
avg(
aggr(
num(sum({$ <DOC_DATE = {'>=$(=yearstart(date(min(DOC_DATE),-1)))<=$(=date(max(DOC_DATE)))'}, YEAR=, MONTH=, NUMBE=>} KOL)
-sum({$ <DOC_DATE = {'>=$(=yearstart(date(min(DOC_DATE),-1)))<=$(=date(max(DOC_DATE)))'}, YEAR=, MONTH=, NUMBE=>} KOL2), '# ##0,00')
,floor(DOC_DATE)
)

Хотя лучше считайте остаток на каждый день в скрипте.

Оффлайн kvv

  • Гуру
  • ***
  • Сообщений: 135
  • Страна: 00
  • Рейтинг: +36/-0
    • Просмотр профиля
Добрый день Софья.
Первый показатель, там где разделить на 4 дня посчитать более легко, нужно взять количество дней: count(Date).
Второй показатель, там где разделить на 3 дня, можно посчитать вот так:
count({$<QUANT_STOCK = {'>0'}>}QUANT_STOCK).

В целом, можно второй показатель посчитать и на этапе загрузке, например:
if (QUANT_STOCK > 0, 1, 0) as QUANT_STOCK_ISИ дальше, в дашборде, считаем суммой QUANT_STOCK_IS.

Неофициальный форум пользователей QlikView & Qlik Sense


Оффлайн Софья

  • Наставник
  • **
  • Сообщений: 71
  • Страна: 00
  • Рейтинг: +14/-0
    • Просмотр профиля
Большое спасибо ответившим, сейчас попробую реализовать согласно первой рекомендации, и согласно второй.

Bibis, Вы имели в виду, что средний остаток лучше считать в скрипте?

Kvv, а можно поподробнее, что значит считать в "дашборде"?

Оффлайн kvv

  • Гуру
  • ***
  • Сообщений: 135
  • Страна: 00
  • Рейтинг: +36/-0
    • Просмотр профиля
Большое спасибо ответившим, сейчас попробую реализовать согласно первой рекомендации, и согласно второй.

Bibis, Вы имели в виду, что средний остаток лучше считать в скрипте?

Kvv, а можно поподробнее, что значит считать в "дашборде"?

В дашборде, это имел ввиду в QlikView. :)
Прикрепленный файл - 01.png.

Оффлайн Софья

  • Наставник
  • **
  • Сообщений: 71
  • Страна: 00
  • Рейтинг: +14/-0
    • Просмотр профиля
Kvv, спасибо за просвещение.)
Буду пробовать, о результатах отпишусь чуть позже.

Оффлайн Софья

  • Наставник
  • **
  • Сообщений: 71
  • Страна: 00
  • Рейтинг: +14/-0
    • Просмотр профиля
avg(
aggr(
num(sum({$ <DOC_DATE = {'>=$(=yearstart(date(min(DOC_DATE),-1)))<=$(=date(max(DOC_DATE)))'}, YEAR=, MONTH=, NUMBE=>} KOL)
-sum({$ <DOC_DATE = {'>=$(=yearstart(date(min(DOC_DATE),-1)))<=$(=date(max(DOC_DATE)))'}, YEAR=, MONTH=, NUMBE=>} KOL2), '# ##0,00')
,floor(DOC_DATE)
)

Хотя лучше считайте остаток на каждый день в скрипте.

Bibis, позвольте задать вопрос, что означает floor(DOC_DATE)? Посчитала, итог прикрепляю в приложении. Формула не работает, но и ошибок не показывает. В чём может быть проблема?

Неофициальный форум пользователей QlikView & Qlik Sense


Оффлайн bibis

  • Наставник
  • **
  • Сообщений: 78
  • Рейтинг: +31/-0
    • Просмотр профиля
floor(DOC_DATE) по сути ваша дата.
Т.е. формула должна считать ваше выражение для каждого дня и выдавать среднее.
Пока не понимаю,почему не работает.буду думать...если работать не заставят)

Оффлайн Софья

  • Наставник
  • **
  • Сообщений: 71
  • Страна: 00
  • Рейтинг: +14/-0
    • Просмотр профиля
Просто не сталкивалась ещё в работе с оператором floor(), поэтому стал интересен его функционал. В любом случае спасибо, тоже буду думать.

Оффлайн bibis

  • Наставник
  • **
  • Сообщений: 78
  • Рейтинг: +31/-0
    • Просмотр профиля
В общем разобрался вроде бы. aggr  судя по всему не группирует по выражениям (странно,раньше не замечал), так что  этот самый Floor(DOC_DATE) считаем сразу в скрипте, обзываем как-нибудь и уже это имя втыкаем в формулу.

Оффлайн Софья

  • Наставник
  • **
  • Сообщений: 71
  • Страна: 00
  • Рейтинг: +14/-0
    • Просмотр профиля
Можно уточнить, как посчитать floor(DOC_DATE) в скрипте? Не совсем ясен синтаксис его расчётов.
Хочу понять, в чём разница между полем DOC_DATE и floor(DOC_DATE), что именно возвращает данный оператор.

Оффлайн bibis

  • Наставник
  • **
  • Сообщений: 78
  • Рейтинг: +31/-0
    • Просмотр профиля
Это просто округление вниз.  Т.е. выдает дату в  числовом формате. В принципе с тем же успехом можно и
date(DOC_DATE, 'YY.MM.DD')  использовать.

А как считать: просто, в табличке, где грузите данные   подгружайте еще расчетное поле:

Load , KOL,KOL2,DOC_DATE, FLOOR(DOC_DATE) as дата
from чтототтам;


Оффлайн Софья

  • Наставник
  • **
  • Сообщений: 71
  • Страна: 00
  • Рейтинг: +14/-0
    • Просмотр профиля
Bibis, спасибо, теперь всё ясно.)

Оффлайн Софья

  • Наставник
  • **
  • Сообщений: 71
  • Страна: 00
  • Рейтинг: +14/-0
    • Просмотр профиля

Второй показатель, там где разделить на 3 дня, можно посчитать вот так:
count({$<QUANT_STOCK = {'>0'}>}QUANT_STOCK).


Добрый день ещё раз.
Kvv, к Вам с вопросом обращаюсь.
Спасибо, остаток, где 0 тоже считается, посчитала.
Но возникает вопрос по второй формуле, где нужно исключить 0. Формула рабочая, выдаёт какой-то результат, но он некорректный.
Суть в том, что у меня остаток: это приходные документы - расходный документы (KOL-KOL2). Т. е. нет такого поля, как остаток, я его убрала. Остаток рассчитываю в выражениях (знаю, что влияет на быстродействие системы), но когда прогружала данную разницу через скрипт - результат был некорректный. Причину так и не нашла на данный момент.
Вкладываю скрин для наглядности.
Последняя колонка, "Без 0", должна содержать совсем другие цифры, они намного меньше должны быть.
В чём может быть проблема?

Оффлайн Софья

  • Наставник
  • **
  • Сообщений: 71
  • Страна: 00
  • Рейтинг: +14/-0
    • Просмотр профиля

В целом, можно второй показатель посчитать и на этапе загрузке, например:
if (QUANT_STOCK > 0, 1, 0) as QUANT_STOCK_IS

Данная формула у меня не работает, когда в выражениях её прописываю. Связано ли это с тем, что я её не в скрипте писала? Я правильно полагаю, что она и в выражениях должна работать, и на этапе прогрузки кода?