Расчёт среднего остатка с учётом и без учёта нулевого остатка

Автор Софья, 16 сентября 2015, 08:01:35

« назад - далее »

Софья

Всем добрый день.

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

Требуется рассчитать средний остаток, причём, двумя способами.Первый расчёт - в нём нужно учесть дни, когда остаток = 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

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

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

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

Софья

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

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

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

kvv

Цитата: Софья от 16 сентября  2015, 11:04:03  
Большое спасибо ответившим, сейчас попробую реализовать согласно первой рекомендации, и согласно второй.

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

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

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

Софья

Kvv, спасибо за просвещение.)
Буду пробовать, о результатах отпишусь чуть позже.

Софья

Цитата: bibis от 16 сентября  2015, 10:47:17  
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)? Посчитала, итог прикрепляю в приложении. Формула не работает, но и ошибок не показывает. В чём может быть проблема?

bibis

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

Софья

Просто не сталкивалась ещё в работе с оператором floor(), поэтому стал интересен его функционал. В любом случае спасибо, тоже буду думать.

bibis

В общем разобрался вроде бы. aggr  судя по всему не группирует по выражениям (странно,раньше не замечал), так что  этот самый Floor(DOC_DATE) считаем сразу в скрипте, обзываем как-нибудь и уже это имя втыкаем в формулу.

Софья

Можно уточнить, как посчитать floor(DOC_DATE) в скрипте? Не совсем ясен синтаксис его расчётов.
Хочу понять, в чём разница между полем DOC_DATE и floor(DOC_DATE), что именно возвращает данный оператор.

bibis

Это просто округление вниз.  Т.е. выдает дату в  числовом формате. В принципе с тем же успехом можно и
date(DOC_DATE, 'YY.MM.DD')  использовать.

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

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


Софья


Софья

Цитата: kvv от 16 сентября  2015, 10:55:15  

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


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

Софья

Цитата: kvv от 16 сентября  2015, 10:55:15  

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


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

Яндекс.Метрика