9 Replies Latest reply: Feb 4, 2015 6:26 AM by Дмитрий Бабич RSS

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

    Nina Zhidkova

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

       

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

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

       

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

       

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

       

      Спасибо!

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

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

           

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

           

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

            • Re: Расчет процента от общей суммы
              Nina Zhidkova

              Добрый день!

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

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

               

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

               

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

               

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

               

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

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

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

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

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

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

                   

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

                    • Re: Расчет процента от общей суммы
                      Nina Zhidkova

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

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

                        • Re: Расчет процента от общей суммы
                          Eugeny Ilyin

                          Добрый день.

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

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

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

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

                            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% в сумме при минимальных отклонениях от нормального округления.

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

                          Нина,

                           

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

                           

                          Наткнулся на статью от Henric Cronström на тему округления чисел и их представления: 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".

                            • Re: Расчет процента от общей суммы
                              Maxim Skorik

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


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

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


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

                               

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


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

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