Страницы: 1
RSS
Power Pivot подсчет количества чеков по условию
 
Доброго времени суток!
Вот уже день ломаю голову над формулой, не могу сделать.
Прошу помочь с построением формулы.
Мне нужно посчитать количество чеков в которых продаж больше 1 и цена проданной единицы больше 100руб.
Когда в сводной в сроки ставлю номера чеков, то работает правильно, но как только  я убираю номера чеков, сумма отличается от той когда с номерами.
Код
[Больше1Дороже100]=IF (
    [Сумма по столбцу Количество ед продано] > 1
        && [МаксЦенаВчеке] > 100;
    DISTINCTCOUNT ( Cheki[Документ] )
)
Мне кажется проблема в расчете максимальной цены в чеке
Код
[МаксЦенаВчеке]=
MAXX (
    'Cheki';
    DIVIDE ( [Сумма по столбцу Выручка]; [Сумма по столбцу Количество ед продано] )
)
Деление в этой мере производится чтобы узнать цену продажи единицы, в случае если продано несколько единиц.
Изменено: Lari - 06.02.2019 08:19:30 (ввел обозначения мер)
 
Доброе время суток.
Цитата
Lari написал:
Вот уже день ломаю голову над формулой, не могу сделать.
Формула где - в вычисляемом столбце таблицы или в мере? Если в мере, то какие измерения используются, если в таблице, то какие в ней столбцы? Вы же уже не первый день на форуме, уже должны понимать, что без контекста рассуждения чаще всего начинают сводиться к сферическому коню в вакууме.
Изменено: Андрей VG - 06.02.2019 08:14:15
 
Андрей VG, да, Вы правы, сделал пример.
Если из сводной убрать номера чеков то получается другое количество чем с номерами чеков.
Изменено: Lari - 06.02.2019 17:54:43 (добавил комментарий)
 
Цитата
Lari написал:
номера чеков
Чек это столбец Документ в таблице?
Цитата
Lari написал:
Мне нужно посчитать количество чеков
Вы имеете в виду в итоге? И количество это всего в чеке или что в чеке есть строка, в которой значений "Количество ед продано" больше 1?
Исходя из предположения, что в документе суммарно "Количество ед продано" быть больше 1 и цена кода больше 100. Версия для Excel 2016 и новее. Впрочем, переделывается и для 2013 заменой Var определений на их значение.
Код
= Var stats = SUMMARIZE('Cheki'; 'Cheki'[Документ]; "max price"; MAXX('Cheki'; DIVIDE('Cheki'[Выручка]; 'Cheki'[Количество ед продано]; 0)); "unit count"; SUM('Cheki'[Количество ед продано]))
Var goodChecks = FILTER(stats; [max price] > 100 && [unit count] > 1)
Var uniqueChecks = SUMMARIZE(goodChecks; 'Cheki'[Документ])
Return COUNTROWS(uniqueChecks)
Изменено: Андрей VG - 06.02.2019 11:49:56
 
Андрей VG, столбец "Документ" это уникальный номер чека.
Цитата
Андрей VG написал:
И количество это всего в чеке или что в чеке есть строка, в которой значений "Количество ед продано" больше 1?
Количество ед. всего в чеке больше 1.
Цитата
Андрей VG написал:
Вы имеете в виду в итоге
тут не совсем понял. если из сводной из строк убрать "Документ", то мера [Больше1Дороже100] выдает 12, но по моему условию таких чеков 3.Нужно чтобы считался верный результат равный 3-м.
Изменено: Lari - 06.02.2019 11:52:49 (P.S. писал это сообщения а кода еще не было.)
 
Андрей VG, формула работает как я просил.
Огромное спасибо!!!
Формула космос, я бы с CALCULATE переставляя условия до скончания века не решил бы задачу((
Буду разбирать.
Изменено: Lari - 06.02.2019 12:04:20 (версия Office 365)
 
Цитата
Lari написал:
я бы с CALCULATE
Почему? Вариант в стиле Максима Зеленского.
Код
=
SUMX (
    VALUES ( Cheki[Документ] );
    IF (
        CALCULATE (
            MAXX ( 'Cheki'; DIVIDE ( 'Cheki'[Выручка]; 'Cheki'[Количество ед продано] ) )
        ) > 100
            && CALCULATE ( SUM ( 'Cheki'[Количество ед продано] ) ) > 1;
        1;
        BLANK ()
    )
)

Думаю, найдёте, где подставить уже созданные вами меры ;)
Скрытый текст
Изменено: Андрей VG - 06.02.2019 12:08:37
 
Познавательный для меня пример.
Начал разбирать с CALCULATE, т.к. по книге итальянцев до SUMMARIZE еще не дошел  :(
Формула с SUMMARIZE в DaxStudio отработала практически в 2 раза быстрее.
Вывод 1 , уточнил понимание таблицы в SUMX - это строки для которых оценивается выражение, и получается VALUES перечисляет номера документов для которых нужны данные.
Вывод 2 CALCULATE в IF нужен для перехода контекста, а если использовать меры, то поскольку меры автоматически завертываются в CALCULATE, там его уже писать не нужно.
Вывод 3 в расчете MAXX можно просто делить столбец на столбец, я же использовал меру, что является избыточным вычислением, т.к. X функция и так оценивает построчно, но максимум вычисляется в пределах одного чека из-за таблицыSUMX(VALUES ( Cheki[Документ].

Андрей VG, еще раз спасибо.
 
Цитата
Андрей VG написал:
Вариант в стиле Максима Зеленского
не, ну я не так в лоб написал бы :)
Код
=
COUNTROWS (
    FILTER (
        VALUES ( Cheki[Документ] ),
        CALCULATE (
            MAXX ( 'Cheki', DIVIDE ( 'Cheki'[Выручка], 'Cheki'[Количество ед продано] ) )
        ) > 100
            && CALCULATE ( SUM ( Cheki[Количество ед продано] ) ) > 1
    )
)

но этот вариант и правда медленнее.

А зачем у Вас второй summarize?
Кстати, вот так, похоже, еще быстрее будет - план запроса покороче и нет CallbackDataID:
Код
=
VAR stats =
    GROUPBY (
        'Cheki',
        'Cheki'[Документ],
        "max price", MAXX (
            CURRENTGROUP (),
            DIVIDE ( 'Cheki'[Выручка], 'Cheki'[Количество ед продано] )
        ),
        "unit count", SUMX ( CURRENTGROUP (), 'Cheki'[Количество ед продано] )
    )
VAR goodChecks =
    FILTER ( stats, [max price] > 100 && [unit count] > 1 )
RETURN
    COUNTROWS ( goodChecks )
F1 творит чудеса
 
Цитата
Максим Зеленский написал:
.А зачем у Вас второй summarize?
вот что бывает, когда раз в квартал что-то на DAX пишешь :D
 
Доброго времени суток!
Не очень понятно
Цитата
FILTER (
       VALUES ( Cheki[Документ] ),
       CALCULATE (
           MAXX ( 'Cheki', DIVIDE ( 'Cheki'[Выручка], 'Cheki'[Количество ед продано] ) )
       ) > 100
           && CALCULATE ( SUM ( Cheki[Количество ед продано] ) ) > 1
   )
функция FILTER идет изнутри наружу,
получается мы имеем таблицу из одного столбца с уникальным списком документов
и к этой таблице уже применяем условия на уже отброшенные  столбцы выручки и количество единиц.
Т.е. фильтруем таблицу по несуществующим столбцам.
Перечитал определения и у итальянце и у Роба Колли, и у майкрософта, но что-то мне это не помогает((
 
Цитата
Lari написал:
получается мы имеем таблицу из одного столбца с уникальным списком документов
верно. Но FILTER - это классический итератор, значит, он создает для этой таблицы строковый контекст. Далее во втором аргументе используется CALCULATE, которая преобразует строковый контекст в контекст фильтра. То есть, например,
Код
CALCULATE ( SUM ( Cheki[Количество ед продано] ) )
вот эта часть теперь рассчитывается для каждой строки таблицы VALUES(Cheki[Документ]) с применением к модели данных фильтра = значение текущего документа. Все равно что для каждой строки этой таблицы считать меру.
Представьте такую запись:
Код
DEFINE
    MEASURE Cheki[Количество] =
        SUM ( Cheki[Количество ед продано] )
    MEASURE Cheki[Макс цена] =
        MAXX ( 'Cheki', DIVIDE ( 'Cheki'[Выручка], 'Cheki'[Количество ед продано] ) )
EVALUATE
FILTER ( VALUES ( Cheki[Документ] ), [Макс цена] > 100 && [Количество] > 1 )
F1 творит чудеса
 
Максим Зеленский, большое спасибо за  подробное объяснение принципа работы.
2 дня обдумывал и разбирал логику вычисления.
Я неправильно и ограниченно представлял суть таблицы (первого параметра) FILTER  и X-функций.
В поиске виртуальной таблицы, созданной VALUES, наткнулся на статью (всё как объяснил Максим, только с картинкой)
Прокрутить до главы  Виртуальные таблицы
 
Lari, ну тогда для полного погружения еще и вот это
F1 творит чудеса
Страницы: 1
Наверх