Страницы: 1
RSS
Возможности оптимизации меры DAX. Ускорить работу меры "продажи и возвраты"
 
Доброго дня, Прошу помощи в оптимизации расчета количества заказов по продажам и возвратам.
Формулы, которые работают, но медленно (объем данных более 3 млн. строк):

продажи:
Код
=countaX( FILTER(SUMMARIZE(FILTER('Продажи';'Продажи'[Наличие возврата]="Нет"&&[Накладная|Подтип]<>"Товарный отчет магазина");'Продажи'[N накл.];'Продажи'[Дата накл.];"кво итог";ROUND(sum('Продажи'[Товар|Кол-во]);3);"мин дата накл темп";CALCULATE(min('Продажи'[Дата накл.]);ALLEXCEPT('Продажи';'Продажи'[N накл.];'Продажи'[Наличие возврата])));[мин дата накл темп]=[Дата накл.]&&[кво итог]>0);'Продажи'[N накл.])
Логика расчета - подсчитываем количество уникальных накладных (поле N накл.) при условии, что [Накладная|Подтип]<>"Товарный отчет магазина", подсчет идет по самой ранней дате каждой накладной + [Наличие возврата]="Нет"

возвраты:
Код
=-countaX( FILTER(SUMMARIZE(FILTER('Продажи';[Накладная|Подтип]<>"Товарный отчет магазина");'Продажи'[N накл.];'Продажи'[Дата накл.];'Продажи'[Наличие возврата];"кво итог";ROUND(CALCULATE(sum('Продажи'[Товар|Кол-во]);ALLEXCEPT('Продажи';'Продажи'[N накл.]));3);"макс дата накл темп";CALCULATE(max('Продажи'[Дата накл.]);ALLEXCEPT('Продажи';'Продажи'[N накл.];'Продажи'[Наличие возврата]));"КП";CALCULATE(COUNT('Продажи'[Товар|Кол-во]);ALLEXCEPT('Продажи';'Продажи'[N накл.])));[макс дата накл темп]=[Дата накл.]&&[кво итог]=0&&[Наличие возврата]="Да"&&[КП]<>BLANK());'Продажи'[N накл.])
Логика расчета - подсчитываем количество уникальных накладных (поле N накл.) при условии, что [Накладная|Подтип]<>"Товарный отчет магазина", подсчет идет по самой поздней дате каждой накладной и + сумма по столбцу Товар|Кол-во для каждого поля N накл.=0

в файле выделил желтым продажи, а красным возвраты
Изменено: mechanix 85 - 23.09.2020 09:38:51
 
Доброе время суток
Цитата
mechanix 85 написал:
подсчет идет по самой ранней дате
А зачем? Вы бы всё же пример составили под те дополнительные ограничения, которые есть в мерах. По примеру достаточно
Продажи
Код
=
CALCULATE (
    DISTINCTCOUNT ( 'Продажи'[N накл.] );
    FILTER (
        'Продажи';
        'Продажи'[Наличие возврата] = "нет"
            && 'Продажи'[Накладная|Подтип] <> "Товарный отчет магазина"
            && 'Продажи'[Товар|Кол-во] > 0
    )
)

возвраты
Код
=
- CALCULATE (
    DISTINCTCOUNT ( 'Продажи'[N накл.] );
    FILTER (
        'Продажи';
        'Продажи'[Наличие возврата] = "да"
            && 'Продажи'[Накладная|Подтип] <> "Товарный отчет магазина"
            && 'Продажи'[Товар|Кол-во] < 0
    )
)
 
в примере я выделил желтым в какой день считаем продажи, а красным  - возвраты. формулы выше не подходят, т.к. если добавляем в таблицу даты, то результат уже неправильный. смотрите файл
Изменено: mechanix 85 - 23.09.2020 09:39:08
 
Тогда попробуйте так для продажи
Код
IF (
    HASONEVALUE ( 'Продажи'[Дата накл.] );
    VAR minDate =
        CALCULATE (
            MIN ( 'Продажи'[Дата накл.] );
            FILTER (
                ALLEXCEPT ( 'Продажи'; 'Продажи'[N накл.] );
                'Продажи'[Наличие возврата] = "нет"
                    && 'Продажи'[Накладная|Подтип] <> "Товарный отчет магазина"
                    && 'Продажи'[Товар|Кол-во] > 0
            )
        )
    RETURN
        IF ( minDate = MIN ( 'Продажи'[Дата накл.] ); 1; BLANK () );
    CALCULATE (
        DISTINCTCOUNT ( 'Продажи'[N накл.] );
        FILTER (
            'Продажи';
            'Продажи'[Наличие возврата] = "нет"
                && 'Продажи'[Накладная|Подтип] <> "Товарный отчет магазина"
                && 'Продажи'[Товар|Кол-во] > 0
        )
    )
)
Страницы: 1
Наверх