Страницы: 1
RSS
DAX Группировка таблиц по виртуальным таблицам
 
Доброго времени суток!
Прошу помочь со следующим вопросом:
1. у меня есть таблица остатков, в которой остатки на понедельники и товары по кодам.
(в артикуле может быть несколько кодов, но артикулы в таблице Product, а в остатках только коды)
на этом же этапе мне нужно отфильтровать те артикулы где меньше 4 ед и магазин который <>№1.
Код
=
FILTER (
    ADDCOLUMNS (
        SUMMARIZE (
            'Ostatki';
            'Ostatki'[Дата];
            'Ostatki'[КлючМагазина];
            'Product'[Арт]
        );
        "osted"; CALCULATE ( SUM ( 'Ostatki'[Остаток] ) )
    );
    'Ostatki'[КлючМагазина] <> 1
        && [osted] > 3
        && NOT ( ISBLANK ( 'Product'[Арт] ) )
)
2. Мне нужно посчитать сначала по магазинам средний остаток каждого артикула за выбранные даты (диапазон выбирается по таблице Календарь),
т.е. сумму остатков артикулов делю на количество уникальных дат, когда были остатки в рамках выбранного временного диапазона( т.е. если данный артикул был на остатке не все понедельники, но другие артикулы были, надо считать все понедельники)
Следующую таблицу я так представляю
'Ostatki'[КлючМагазина];'Product'[Арт]; среднее по датам
3. Потом среднее по магазинам для каждого артикула.(остаток артикула делю на всего магазинов за выбранный период)
Даже если именно этого артикула не было во всех магазинах, нужно количество магазинов где вообще имелись остатки по всем артикулам.
3-ю таблицу вижу как 'Product'[Арт]; среднее по магазинам.
и на последнем этапе получить среднее значение по артикулам.
Не представляю как соорудить пример из нескольких таблиц с артикулами и кодами и датами.
 
Lari, добрый день. Вы, как обычно, ленитесь составить пример и ждете профи, которые с лету дадут Вам ответ только описанию. Ладно, ждите.
 
Доброго времени суток!
Пример во вложении.
 
Доброе время суток
Вариант, как понял (честно говоря - не понял что нужно посчитать). Зураб, зачем описывать путь решения, если он ведёт к неправильному результату, особенно если не поставлена цель - что собственно нужно посчитать?
Код
=Var notShop4Remainders = CALCULATETABLE('Ostatki'; FILTER('Magazini'; 'Magazini'[Nazvanie] <> "Магазин 4"))
Var calc = AVERAGEX(
    SUMMARIZE(notShop4Remainders; 'Календарь'[Date]; 'Product'[Artikul]; 'Magazini'[KodMagazina]);
    Var remainderSum = CALCULATE(SUM('Ostatki'[OstatokEd]))
    Return IF(remainderSum > 3; remainderSum; BLANK())
)
Return calc

Считается: средний остаток на измерениях: дата календаря, артикулам, магазинам, если на этих измерениях сумма остатков больше 3 и магазин не равен "Магазин 4". Не забываем, что если на текущем наборе сумма остатков IsBlank, то AVERAGEX их игнорирует и не учитывает в подсчёте среднего.
 
Андрей VG, доброго времени суток!
Цитата
Андрей VG написал:
честно говоря - не понял что нужно посчитать
я пытаюсь посчитать средний остаток единиц артикулов
среди средних остатков этих артикулов по магазинам
среди остатков  по пртикулам магазинам и датам.

поскольку AVERAGEX игнорирует отсутствующие значения, я не могу использовать эту функцию.
Например у меня артикул 1 есть на остатках во всех 4-х понеделниках октября, а артикул 2 только в 2.
и артикул 1 и артикул 2 мне нужно разделить на 4 чтобы я получил средний остаток в октябре по датам.
Или артикул 1 есть во всех магазинах в октябре, а артикул 2 только в 3-х.
И артикул 1 и артикул 2 нужно разделить на общее количество магазинов в октябре чтобы получить средний остаток по магазинам.
 
Еще раз попробую описать что мне нужно, я понимаю что у меня не очень получается, спасибо за терпение
  1. сначала я получаю количество единиц по артикулам и магазинам и датам
  2. потом я считаю средний остаток по датам для магазинов и артикулов
  3. потом средний остаток по магазинам для артикулов
  4. и в итоге я считаю среднее по всем артикулам.
таким образом в сводной я получу что за октябрь средний остаток 4,5 единиц например( взял из головы) результат из пункта 4.
при этом если я в сводной детализирую до артикула, то там среднее количество из пункта 3.

Но средние мне нужно посчитать не через average а как я описал в предыдщем сообщении.
Надеюсь смог прояснить что я пытаюсь посчитать.
 
Цитата
Lari написал:
1. сначала я получаю количество единиц по артикулам и магазинам и датам
Что это означает? Чем это отличается от
Цитата
Lari написал:
потом я считаю средний остаток по датам для магазинов и артикулов
:qstn:
 
Андрей VG,во вложении пример этих таблиц.
 
В рамках примера, можно вообще обойтись без виртуальных таблиц, фактически
Код
=Var notShop4Remainders = CALCULATETABLE('Ostatki'; FILTER('Magazini'; 'Magazini'[Nazvanie] <> "Магазин 4"))
Var notShop4DayCount = COUNTROWS(SUMMARIZE(notShop4Remainders; 'Ostatki'[Date]))
Var notShop4ShopCount = COUNTROWS(SUMMARIZE(notShop4Remainders; 'Ostatki'[KodMagazina]))
Return DIVIDE(SUMX(notShop4Remainders; 'Ostatki'[OstatokEd]); 
    notShop4DayCount * notShop4ShopCount;
    BLANK()
)
 
Андрей, убираются ли из расчетов артикулы, котрые на дату и магазин меньше 4 ед?
т.е. если у артикула в магазине на конкретную дату меньше 4 ед, он не должен считаться.
Пример Магазин1, артикул 1, 09.11.20 остаток 3 единицы. - такой артикул в дальнейших расчетах не должен участвовать.
Изменено: Lari - 22.11.2020 17:29:58
 
Цитата
Lari написал:
такой артикул в дальнейших расчетах не должен участвовать.
А какое количество артикулов должно участвовать в расчёте? Последнее приближение. Надеюсь, коллеги утром завтра лучше смогут понять.
Код
=Var notShop4Remainders = CALCULATETABLE('Ostatki'; FILTER('Magazini'; 'Magazini'[Nazvanie] <> "Магазин 4"))
Var notShop4DayCount = COUNTROWS(SUMMARIZE(notShop4Remainders; 'Ostatki'[Date]))
Var notShop4ArticulCount = COUNTROWS(CALCULATETABLE(VALUES('Product'[Artikul]); notShop4Remainders))
Var notShop4ShopCount = COUNTROWS(SUMMARIZE(notShop4Remainders; 'Ostatki'[KodMagazina]))
Var more3Sum = SUMX(SUMMARIZE(notShop4Remainders;
    'Ostatki'[Date]; 'Magazini'[KodMagazina]; 'Product'[Artikul]);
    Var curSum = CALCULATE(SUM('Ostatki'[OstatokEd]))
    Return IF(curSum > 3; curSum; BLANK())
)
Return DIVIDE(more3Sum;
    notShop4DayCount * notShop4ShopCount * notShop4ArticulCount;
    BLANK()
)
 
Андрей, дорого времени суток!
Цитата
Андрей VG написал:
А какое количество артикулов должно участвовать в расчёте?
количество артикулов которых больше 3 ед. на остатке в разрезе Магазин; Артикул; Дата.
Изменено: Lari - 23.11.2020 06:49:29
 
Андрей VG, я осмелился запустить руки в ваш код, но потерпел фиаско
попробовал заменить переменную notShop4ArticulCount
не знаю как посчитать уникальное количество этих артикулов((
Код
=
VAR notShop4Remainders =
    CALCULATETABLE (
        'Ostatki';
        FILTER ( 'Magazini'; 'Magazini'[Nazvanie] <> "Магазин 1" )
    )
VAR notShop4DayCount =
    COUNTROWS ( SUMMARIZE ( notShop4Remainders; 'Ostatki'[Date] ) )
VAR notShop4ArticulCount =
    COUNTROWS (
        FILTER (
            SUMMARIZE (
                notShop4Remainders;
                'Ostatki'[Date];
                'Magazini'[KodMagazina];
                'Product'[Artikul]
            );
            VAR curSum = CALCULATE ( SUM ( 'Ostatki'[OstatokEd] ) ) RETURN curSum > 3
        )
    )
VAR notShop4ShopCount =
    COUNTROWS ( SUMMARIZE ( notShop4Remainders; 'Ostatki'[KodMagazina] ) )
VAR more3Sum =
    SUMX (
        SUMMARIZE (
            notShop4Remainders;
            'Ostatki'[Date];
            'Magazini'[KodMagazina];
            'Product'[Artikul]
        );
        VAR curSum =
            CALCULATE ( SUM ( 'Ostatki'[OstatokEd] ) )
        RETURN
            IF ( curSum > 3; curSum; BLANK () )
    )
RETURN
    DIVIDE (
        more3Sum;
        notShop4DayCount * notShop4ShopCount * notShop4ArticulCount;
        BLANK ()
    )
Изменено: Lari - 23.11.2020 06:56:30
 
Цитата
Lari написал:
я осмелился запустить руки в ваш код
Нет проблем, уделайте его как Тузик грелку. И вы почти докрутили
Код
=  Var notShop4Remainders = CALCULATETABLE('Ostatki'; FILTER('Magazini'; 'Magazini'[Nazvanie] <> "Магазин 4"))
Var notShop4Stats = SUMMARIZE(notShop4Remainders; 'Ostatki'[Date]; 'Product'[Artikul]; 'Magazini'[KodMagazina]; 
    "remainder  value"; SUM('Ostatki'[OstatokEd]))
Var notShop4More3 = FILTER(notShop4Stats; [remainder  value] > 3)
Var notShop4More3ArticulCount = COUNTROWS(SUMMARIZE(notShop4More3; 'Product'[Artikul]))
 
Андрей VG, большое спасибо за помощь!
Цитата
Андрей VG написал:
уделайте его как Тузик грелку.
скорее мартышка напишет "Войну и мир" случайно тыкая в в клавиатуру, чем я такое осуществлю))
Цитата
Андрей VG написал:
И вы почти докрутили
Спасибо за поддержку))
Страницы: 1
Наверх