Табличная ассоциация DAX Daily Many-to-Many

Я почти на грани решения проблемы, которая у меня есть в модели в настоящее время... в основном, у меня есть "временная" таблица сопоставления "многие ко многим", которая отображает комиссионные ставки для менеджеров с течением времени... они могут меняться ежедневно , (но делаю это редко), поэтому я пытался избежать просто огромной таблицы с одинаковыми значениями, повторяющимися, хотя и для разных конкретных дат, если я все равно сделаю это, я получу таблицу с 200 миллионами записей, что особенно важно, более один менеджер может получить комиссию за продажу определенного вида товара :s

Примечание. Некоторые комиссионные выплачиваются только одному менеджеру, а некоторые - нескольким, и со временем это может меняться.

Вместо этого я сохранил даты ValidFrom и ValidTo в таблице сопоставления...

Каждое решение, которое я придумываю, смертельно медленное, и я просто понятия не имею, есть ли вообще решение на данный момент... вот ссылка на очень маленький пример: - http://1drv.ms/1gOr7uw

Область, которую я считаю наиболее проблематичной, - это получение правильной «ставки» для данного менеджера в определенный день ... единственный способ, которым я могу это сделать, - это вложенный SUMX, но должно быть что-то пижон, которого мне не хватает?!

Одна вещь, о которой я подумал (но не смог реализовать), заключалась в том, чтобы просто сохранить дату вступления в силу, отфильтровать ее и использовать LASTNONBLANK() или что-то в этом роде?

Может быть, кто-то со свежим взглядом сможет мне помочь? Таскаю мои волосы здесь!

Правка: Кто-то, вероятно, скажет, почему бы мне не сделать это в ETL, что я здесь не показал, так это то, что у меня есть другие показатели, которые не нужно разделять между менеджерами, но вместо этого следует сообщать полную сумму для каждого... но общая сумма не является суммой всех менеджеров (т.е. поведение M2M по умолчанию)

Возможно, мне нужны две таблицы фактов? Возможно, кто-то мог бы смоделировать мои данные в Excel, чтобы добиться «разделения» фактов, как я это вижу, независимо от того, как решить проблему, некоторым вычислениям потребуется выполняться во время выполнения. Я думаю?!

Ty.


person m1nkeh    schedule 22.07.2015    source источник


Ответы (1)


Попробуйте это, я не проверял производительность, но я не ожидаю, что они будут супер... тем не менее, по крайней мере, это выглядит элегантно :)

Amount := 
SUMX (
    SUMMARIZE (
        Mapping,
        Mapping[Manager],
        Mapping[Rate],
        Mapping[ValidFrom],
        Mapping[ValidTo],
        Products[Products],
        "SalesInPeriod", Mapping[Rate]
            * CALCULATE (
                SUM ( Sales[Amount] ),
                VALUES ( 'Date'[Date] ),
                DATESBETWEEN (
                    'Date'[Date],
                    Mapping[ValidFrom],
                    Mapping[ValidTo]
                )
            )
    ),
    [SalesInPeriod]
)

Если вы хотите считать, сохраняя работу временного M2M, это должно сработать:

Count := 
CALCULATE (
    COUNTROWS ( Sales ),
    GENERATE (
        SUMMARIZE (
            Mapping,
            Mapping[ValidFrom],
            Mapping[ValidTo],
            Products[Products]
        ),
        DATESBETWEEN (
            'Date'[Date],
             Mapping[ValidFrom],
             Mapping[ValidTo]
        )   
    ),
    VALUES ( 'Date'[Date] )
)

Эта последняя версия проще, потому что ей не нужны Rate и Manager (или ей нужен менеджер, но он уже находится в контексте фильтра, и SUMX не требуется, так как вы агрегируете с использованием канонического M2M).

person Alberto Ferrari    schedule 22.07.2015
comment
Что ж, это кажется мне превосходным, производительность вполне приемлема для моих целей... резюмирование не является одним из моих наиболее понятных, и я не слишком уверен, почему именно это намного более эффективно, возможно, кто-то может объяснить, но я очень доволен этим, спасибо, Альберто! - person m1nkeh; 28.07.2015
comment
Любые советы о том, как я могу предотвратить агрегирование количества продаж по всем менеджерам, т. е. достичь стандартной функциональности «многие ко многим», используя ту же технику. Это немного обманывает меня. Тай. - person m1nkeh; 28.07.2015
comment
Я добавил вторую формулу к ответу (возможно, я мог бы ответить здесь, но я не привык к этому сайту...) - person Alberto Ferrari; 29.07.2015
comment
да, я знаю, не самый лучший из сайтов .. tbh, если бы я мог снова проголосовать за это, я бы это сделал. Решение для взлома, большое спасибо! - person m1nkeh; 30.07.2015