Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Расчет процента от общей суммы

Здравствуйте, уважаемые коллеги!

У меня возникли вопросы с расчетом процента от общей суммы.

Предположим, имеется набор групп продуктов и сами продукты. К примеру, группа А содержит продукты К, Л, М.  Продукта К было продано 7 единиц, продукта Л – 20, продукта М – 50. Соответственно в группе А было продано всего 77 единиц.  Следовательно, процент продаж продукта К = 7/77*100 = 9,090909% и так далее.  Полученные проценты нужно округлить до определенного разряда.

В общем-то простая задачка. Но сумма процентов по всем продуктам в группе должна быть 100%, а из-за округления она может отличаться.

Подскажите, пожалуйста, как можно решить эту проблему. Имеются ли в QlikView встроенные механизмы решения такой задачи?

Спасибо!

9 Replies
Not applicable
Author

Нина, добрый день.

QlikView автоматически округлит проценты продаж по продуктам таким образом (независимо от разряда), чтобы общая сумма процентов по всем продажам равнялась 100.

Во вложении простенькая модель, иллюстрирующая данный пример, и скриншот отчета.

Not applicable
Author

Добрый день!

Не получается по вашей схеме. Таблица у меня аналогичная вашей, только в выражении такая формула (мне нужно, чтобы именно в группе было 100%):

= sum(Сумма) / sum(TOTAL <ЦентрОтвНаименование> Сумма

ЦентрОтвНаименование это моя группа.

Сумма в группе отображается 100,000000%, а если подсчитать руками, то получается 99,99999%.

Во вложении рассчитанный столбец данных.

Немного изменила ваш файл проекта - исправила исходные числа и подправила формулу выражения. В группе 1 видна та же самая проблема - если подсчитать сумму процентов, то выходит 100,01%. Измененный проект прикрепила.

Anonymous
Not applicable
Author

Вопрос в том- что значит в вашем понимании решение .

В простом случае , скажем у вас 3 товара с равными продажами. Т.е. 33,(3) %  каждый.

Предположим округлять нужно до целых %.

Очевидно, что  для получения в итоге 100% вам придется какой-то из товаров округлять иначе, чем остальные 2.

Т.е. например 33%, 33%, 34%  что кажется менее корректным, чем 33%,33%,33%, пусть даже в итоге они и дают 99.

Not applicable
Author

Дмитрий, в моем случае, решение - это получить 100% в группе так, как это требует постановка конкретно моей задачи.

Вопрос в том, как правильно округлить эти проценты? Применительно к QlikView, я же не могу округлять разные строки таблицы разным образом. Как быть в таком случае?

Not applicable
Author

Нина,

Действительно, если посмотреть на измененный вами пример, то становится ясно, что я ошибался. Спасибо.

Наткнулся на статью от hic на тему округления чисел и их представления: http://community.qlik.com/blogs/qlikviewdesignblog/2013/12/17/rounding-errors

Насколько я понял, то ошибок в случаях, подобных описанному вами, можно гарантированно избежать, только путем использования целых чисел (в нашем случае, округления процентов до целых, получается). К остальным случаям, видимо, подходит следующая фраза, цитирую: "First of all, you should realize that the rounding errors are small and usually insignificant. In most cases they will not affect the result of the analysis".

Eugeny_Ilyin
Creator II
Creator II

Добрый день.

В таких случаях выручает отображение третьего знака после запятой. И ничего с этим не поделать - математика.

Not applicable
Author

Данная задача округления является классической. В обычной жизни решается либо принятием того факта что это математически правильно и не может сумма округленная по строкам сходиться с желаемой суммой итого, либо "подтасовкой" - простым программированием и добрасыванием/уменьшением первой/последней строки документа на необходимую для совпадения значений сумму. Классический пример – разноска НДС в счете.


Если есть возможность расширить набор исходных данных, можно попробовать сделать так.

Нам понадобится порядковый номер строк.


Далее наколдовать конструкцию типа:

если номер строки минимальный для данной выборки, и если сумма округленых значений по строкам <> 100%, то значение в ячейке "= sum(Сумма) / sum(TOTAL <ЦентрОтвНаименование> Сумма) + 0,01 (или соответственно разряду округления)", иначе значение в ячейке = sum(Сумма) / sum(TOTAL <ЦентрОтвНаименование> Сумма)


Т.е. в текущей выборке на минимальный порядковый номер строки добрасываем необходимую до 100% сумму. И будет вам счастье.

Чуть посвободнее буду попозже, попробую набросать формулку.

Not applicable
Author

да, забыл... округлять надо не "отображением такого то знака после запятой", а формулой типа round()

Anonymous
Not applicable
Author

Хм. странное несколько требование.

Ну попробуйте вот так (извиняюсь за корявое форматирование):

if(

Rank(

fabs(Sum(Продажи) / Sum(TOTAL <Группа> Продажи)-round(Sum(Продажи) / Sum(TOTAL <Группа> Продажи),0.00001)))

>=

fabs(Round(1-

Sum(TOTAL  <Группа>

Aggr(

Sum(Продажи) / Sum(TOTAL <Группа> Продажи),Продукт)

),0.00001)/0.00001

),

round(Sum(Продажи) / Sum(TOTAL <Группа> Продажи),0.00001)+

if(

Round(1-

Sum(TOTAL  <Группа>

Aggr(

Sum(Продажи) / Sum(TOTAL <Группа> Продажи),Продукт)

),0.00001)>0, 0.00001,-0.00001)

,round(Sum(Продажи) / Sum(TOTAL <Группа> Продажи),0.00001))

Формула выбирает на сколько условных единиц сумма округленных значений отличается  от 100%

(где условная единица это минимальный разряд в округлении, в примере 0.00001) пусть Х.

Затем берет Х значений с максимальным по модулю отклонением реального значения от округленного и, в зависимости от знака отклонения, прибавляет или отнимает по одной условной единице к каждому из них.

В итоге получаем гарантированные 100% в сумме при минимальных отклонениях от нормального округления.