Мне нужно объединить столбцы из четырех разных таблиц в одну сводную таблицу. У меня есть отношения один-ко-многим между этими таблицами. Я хочу сделать это, используя формулу DAX, в настоящее время я могу перетаскивать разные столбцы в визуальный элемент таблицы и получать ожидаемый результат, но я хочу избежать решения проблемы таким образом.
Я написал следующую формулу, на данный момент она показывает только столбцы из таблицы Purchase_requisition. Я хочу включить один столбец из таблиц «eng_firms», «business-unit» и «user». То, что я пробовал до сих пор, закомментировано. Когда я пытаюсь добавить столбцы из разных таблиц, он сообщает мне, что столбцы либо не существуют, либо столбец не имеет связи ни с одной таблицей, доступной в текущем контексте.
Причина, по которой у меня есть ФИЛЬТР в начале, заключается в том, что таблица Purchase_requisition содержит более 100 000 строк. Эта таблица взята из DirectQuery.
Я также попытался SUMMARIZECOLUMNS заменить SELECTCOLUMNS, это дало другую ошибку, в которой говорилось, что невозможно определить одно значение для столбца [item_delivery_date_lfdat].
FilteredTable =
FILTER(
ADDCOLUMNS(
CROSSJOIN(
SELECTCOLUMNS(
FILTER(purchase_requisition, purchase_requisition[item_delivery_date_lfdat] = TODAY() && purchase_requisition[flag_goods_service] = "Service" && purchase_requisition[deletion_indicator_in_purchasing_document_loekz] <> "X"),
"VendorKey", 'purchase_requisition'[desired_vendor_lifnr], -- relationship with 'eng-firms'[Vendor_number]
"PlantKey", 'purchase_requisition'[plant_key], -- relationship with 'business-unit'[plant_key]
"User", purchase_requisition[name_of_requisitioner_requester_afnam] --relationship with 'user'[user_identifier]
),
SELECTCOLUMNS(
'eng-firms',
"VendorNumber", 'eng-firms'[Vendor_number],
"Firm", 'eng-firms'[Parent]
),
SELECTCOLUMNS(
'business-unit',
"BuPlantKey", 'business-unit'[plant_key],
"BusinessUnit", 'business-unit'[business_unit.1]
),
SELECTCOLUMNS(
'user',
"UserIdentity", 'user'[user_identifier],
"EmailAddress", 'user'[email_address]
)
),
"ReqNumber", 'purchase_requisition'[purchase_requisition_number_banfn],
"ProjectTitle", 'purchase_requisition'[short_text_txz01],
"DeliveryDate", purchase_requisition[item_delivery_date_lfdat],
"Firm", 'eng-firms'[Parent],
"BusinessUnit", 'business-unit'[business_unit.1],
"EmailAddress", 'user'[email_address]
),
NOT ISBLANK([ReqNumber]) && NOT ISBLANK ([ProjectTitle]) && NOT ISBLANK([DeliveryDate]) && NOT ISBLANK([Firm]) && NOT ISBLANK([BusinessUnit]) && NOT ISBLANK([EmailAddress])
)
Я сузил код до следующего, чтобы протестировать функциональность CROSSJOIN, и Power BI работал над ним более 1 часа.





Я попытался повторить ваш пример с тремя таблицами и двумя фильтрами в Таблице A:
MyTable =
FILTER(
ADDCOLUMNS(
CROSSJOIN(
SELECTCOLUMNS(
FILTER(TableA, TableA[ColA] <> "XXXX"),
"Id", TableA[Id],
"ColA_TableA", TableA[ColA]
),
SELECTCOLUMNS(
TableB,
"ColB_TableB", TableB[ColB]
),
SELECTCOLUMNS(
FILTER(TableC, TableC[ColC] = TODAY()),
"ColC_TableC", TableC[ColC]
)
),
"ColA", [ColA_TableA],
"ColB", [ColB_TableB],
"ColC", [ColC_TableC]
),
NOT ISBLANK([ColA]) && NOT ISBLANK([ColB]) && NOT ISBLANK([ColC])
)
Вам необходимо решить, какой адрес электронной почты вы используете, потому что, если пользователи могут иметь несколько записей в таблице «пользователь», вам нужно будет уточнить, как вы присоединяетесь или фильтруете эти таблицы. :
ADDCOLUMNS(
CROSSJOIN(...),
"EmailAddress", CALCULATE(MIN('user'[email_address]))
)
ColC — это текст столбца, я не расширял отображаемую таблицу. В чем проблема на данный момент?
Я отредактировал код в своем сообщении, чтобы использовать ту же структуру, которую вы предложили. В настоящее время ошибка выглядит следующим образом: «Невозможно определить одно значение для столбца «email_address» в таблице «пользователь». Это может произойти, когда формула меры ссылается на столбец, который содержит много значений без указания агрегирования, такого как мин, макс, количество. или суммируйте, чтобы получить один результат».
Я не нашел нескольких записей в таблице «пользователь». Я считаю, что функция CROSSJOIN не поддерживает DirectQuery, таблица «purchase_requisition» взята из DirectQuery, и я считаю, что это вызывает проблему.
Можете ли вы предоставить некоторые данные, чтобы я мог проверить?
Нет, я не могу поделиться данными.
Я пытаюсь найти способ помочь вам.
Каков ваш источник данных?
Я знаю, я не могу этим поделиться, это конфиденциальные данные компании. Как я уже сказал, проблема не в данных. См. суженную формулу, которую я добавил. Power BI не выдает никаких ошибок, но и результата не дает.
Я спрашиваю об источнике данных: база данных или файлы? потому что, если это база данных, вы можете использовать, например, SQL
Purchase_requisition из базы данных, другие таблицы добавляются в PowerBi. У меня есть доступ только к набору данных Power BI, поэтому я надеюсь завершить его в Power Bi.
Со сколькими строками вы имеете дело?
Более 100 000
Ваша модель данных выглядит так? Модель данных
Это желаемый результат, который вы хотите получить с помощью расчетной таблицы? Желаемый результат
[Обновление] Отлично! В этом случае вы действительно пытаетесь добавить дополнительные столбцы в таблицу фактов. Мы знаем, что таблица фактов связана со всеми таблицами измерений отношением «многие к одному», поэтому в каждой таблице измерений есть только одна соответствующая строка, которая нам нужна. Учитывая существование отношений, если ваша модель будет находиться в режиме импорта, вы можете просто применить этот код для получения желаемого результата (т. е. получения соответствующей строки из таблицы измерений вместо использования crossjoin() ).
FilteredTable =
VAR _FilterDate = DATE( 2024, 4, 30 )
VAR _ResultTable =
SELECTCOLUMNS(
FILTER(
purchase_requisition,
purchase_requisition[item_delivery_date_lfdat] = _FilterDate && purchase_requisition[flag_goods_service] = "Service" && purchase_requisition[deletion_indicator_in_purchasing_document_loekz] = "X"
),
"ReqNumber", 'purchase_requisition'[purchase_requisition_number_banfn],
"ProjectTitle", 'purchase_requisition'[short_text_txz01],
"DeliveryDate", FORMAT( purchase_requisition[item_delivery_date_lfdat], "dd MMMM yyyy" ),
"Firm", RELATED( 'eng-firms'[Parent] ),
"BusinessUnit", RELATED( 'business-unit'[business_unit.1] ),
"EmailAddress", RELATED( 'user'[email_address] )
)
RETURN _ResultTable
Однако наличие DirectQuery добавляет к модели «ограниченные отношения», поэтому мы больше не можем использовать функцию linked() для создания вычисляемой таблицы. Поэтому мы заменяем его поиском (это безопасно из-за связи «многие к одному»). Таким образом, окончательная версия кода будет выглядеть так:
FilteredTable =
VAR _FilterDate = DATE( 2024, 4, 30 )
VAR _ResultTable =
SELECTCOLUMNS(
FILTER(
purchase_requisition,
purchase_requisition[item_delivery_date_lfdat] = _FilterDate && purchase_requisition[flag_goods_service] = "Service" && purchase_requisition[deletion_indicator_in_purchasing_document_loekz] = "X"
),
"ReqNumber", 'purchase_requisition'[purchase_requisition_number_banfn],
"ProjectTitle", 'purchase_requisition'[short_text_txz01],
"DeliveryDate", FORMAT( purchase_requisition[item_delivery_date_lfdat], "dd MMMM yyyy" ),
"Firm", LOOKUPVALUE( 'eng-firms'[Parent], 'eng-firms'[Vendor_number], purchase_requisition[desired_vendor_lifnr] ),
"BusinessUnit", LOOKUPVALUE( 'business-unit'[business_unit.1], 'business-unit'[plant_key], purchase_requisition[plant_key] ),
"EmailAddress", LOOKUPVALUE( user[email_address], user[user_identifier], purchase_requisition[name_of_requisitioner_requester_afnam] )
)
RETURN _ResultTable
Вот скриншоты обоих выходов: Режим импортаПрямой запрос
Надеюсь, это поможет и удачи в вашем проекте!
Да, именно в обоих случаях модель данных и желаемый результат верны.
Идеальный! Я только что обновил свой первоначальный ответ решением. Я надеюсь, что это помогает!
Спасибо за вклад. КолК прав? Я не вижу вашей модели.