Как в Power BI (DAX) создать меру, использующую промежуточную таблицу для вычислений?

Имеются три таблицы данных (b_crm_deal, b_uts_crm_deal, doc_Sales), связанные последовательно следующим образом:<br/> b_crm_deal.ID = b_uts_crm_deal.VALUE<br/> и<br/> b_uts_crm_deal.№ ЗК = doc_Sales.Number. Правильно ли я понимаю эти связи?
  • 7 апреля 2026 г. 22:01
Ответы на вопрос 2
Коротко — да, вы правильно поняли смысл связей: в таблице b_uts_crm_deal поле VALUE хранит идентификатор сделки (b_crm_deal[ID]), а в том же b_uts_crm_deal поле «№ ЗК» хранит номер документа, который соответствует doc_Sales[Number]. Важно только проверить два момента перед созданием мер и связей в модели:

- типы данных в полях совпадают (строка/число) — иначе связь не создастся или будет некорректна;
- уникальность значений на «one»-стороне связи. Если doc_Sales[Number] уникален — то логично делать связь doc_Sales (one) → b_uts_crm_deal (many). Если b_crm_deal[ID] уникален — связь b_crm_deal (one) → b_uts_crm_deal (many).

Однако важно понимать поведение фильтров: если обе связи направлены «на» b_uts_crm_deal (т.е. doc_Sales (one) → b_uts_crm_deal (many) и b_crm_deal (one) → b_uts_crm_deal (many)), то фильтр от b_crm_deal не будет автоматически распространяться на doc_Sales через b_uts_crm_deal. Чтобы фильтр проходил по цепочке b_crm_deal → b_uts_crm_deal → doc_Sales у вас есть варианты:

1) Сделать вторую связь так, чтобы фильтр шел от b_uts_crm_deal к doc_Sales (если это логично по cardinality), либо установить Cross filter direction = Both для второй связи (или для обеих) — но с осторожностью (может вести к двусмысленным фильтрам и проблемам с производительностью).

2) Не менять направление связей, а в мере явно передавать набор «№ ЗК» в doc_Sales с помощью TREATAS или фильтрации — это наиболее безопасный и контролируемый способ.

Примеры мер.

A) Простая мера через TREATAS (если в визуале b_uts_crm_deal фильтруется связью от b_crm_deal):
Sales by ZK (TREATAS) =
CALCULATE(
    SUM(doc_Sales[Amount]),
    TREATAS( VALUES(b_uts_crm_deal[№ ЗК]), doc_Sales[Number] )
)

Если b_uts_crm_deal уже отфильтрован по текущей сделке (через связь b_crm_deal → b_uts_crm_deal), то TREATAS передаст эти номера в doc_Sales.

B) Мера, устойчиво связывающая по цепочке без изменения направлений связей (использует проверку в фильтре):
Sales for selected deal (robust) =
CALCULATE(
    SUM(doc_Sales[Amount]),
    FILTER(
        doc_Sales,
        COUNTROWS(
            FILTER(
                b_uts_crm_deal,
                b_uts_crm_deal[№ ЗК] = doc_Sales[Number]
                && b_uts_crm_deal[VALUE] IN VALUES(b_crm_deal[ID])
            )
        ) > 0
    )
)

Эта мера для каждой строки doc_Sales проверяет, есть ли в b_uts_crm_deal связь между текущим doc_Sales[Number] и любой из выбранных сделок. Работает, даже если направление связей не позволяет автоматически распространять фильтр.

C) Альтернатива с LOOKUPVALUE (подходит, если для doc_Sales[Number] максимум одна запись в b_uts_crm_deal):
Sales by lookup =
CALCULATE(
    SUM(doc_Sales[Amount]),
    FILTER(
        doc_Sales,
        LOOKUPVALUE(b_uts_crm_deal[VALUE], b_uts_crm_deal[№ ЗК], doc_Sales[Number]) IN VALUES(b_crm_deal[ID])
    )
)

Замечания и рекомендации:
- Проверьте уникальность и cardinality перед настройкой связей. В модельных связях правильно указывать одну сторону (one) для уникальных полей.
- Если возможно корректно настроить направление связей так, чтобы фильтр из b_crm_deal доходил до doc_Sales (через b_uts_crm_deal), то наиболее простые меры будут работать без дополнительных TREATAS/FILTER.
- Если связи сложные/многие-ко-многим — используйте явные DAX-ограничения (TREATAS, FILTER, виртуальные таблицы) или создайте промежуточную таблицу-справочник.

Если хотите, пришлите примеры нескольких строк из таблиц (поля ID, VALUE, № ЗК, Number и сумму в doc_Sales) — помогу написать точную меру под вашу структуру и подскажу, как правильно настроить связи в модели.
фильтр от Ответственного не пробивается через промежуточную таблицу до doc_Sales — по дефолту связи однонаправленные. Добавь CROSSFILTER в меру: <br/> <br/> <pre><code>ФАКТ = CALCULATE(
    SUM(doc_Sales[Amount]),
    CROSSFILTER(b_crm_deal[ID], b_uts_crm_deal[VALUE], Both),
    CROSSFILTER(b_uts_crm_deal[№ ЗК], doc_Sales[Number], Both)
)</code></pre> <br/> <br/> или в модели тыкни на связи и поставь направление "Оба", но это мб сломает другие визуалы.
Похожие вопросы