Power BI DAX, несколько столбцов из разных таблиц в одну таблицу

Мне нужно объединить столбцы из четырех разных таблиц в одну сводную таблицу. У меня есть отношения один-ко-многим между этими таблицами. Я хочу сделать это, используя формулу 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 часа.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
421
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я попытался повторить ваш пример с тремя таблицами и двумя фильтрами в Таблице 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]))
)

Спасибо за вклад. КолК прав? Я не вижу вашей модели.

Zachary Belanger 29.04.2024 15:43

ColC — это текст столбца, я не расширял отображаемую таблицу. В чем проблема на данный момент?

Amira Bedhiafi 29.04.2024 15:44

Я отредактировал код в своем сообщении, чтобы использовать ту же структуру, которую вы предложили. В настоящее время ошибка выглядит следующим образом: «Невозможно определить одно значение для столбца «email_address» в таблице «пользователь». Это может произойти, когда формула меры ссылается на столбец, который содержит много значений без указания агрегирования, такого как мин, макс, количество. или суммируйте, чтобы получить один результат».

Zachary Belanger 29.04.2024 15:49

Я не нашел нескольких записей в таблице «пользователь». Я считаю, что функция CROSSJOIN не поддерживает DirectQuery, таблица «purchase_requisition» взята из DirectQuery, и я считаю, что это вызывает проблему.

Zachary Belanger 29.04.2024 17:09

Можете ли вы предоставить некоторые данные, чтобы я мог проверить?

Amira Bedhiafi 29.04.2024 17:12

Нет, я не могу поделиться данными.

Zachary Belanger 29.04.2024 19:17

Я пытаюсь найти способ помочь вам.

Amira Bedhiafi 29.04.2024 19:44

Каков ваш источник данных?

Amira Bedhiafi 29.04.2024 19:44

Я знаю, я не могу этим поделиться, это конфиденциальные данные компании. Как я уже сказал, проблема не в данных. См. суженную формулу, которую я добавил. Power BI не выдает никаких ошибок, но и результата не дает.

Zachary Belanger 29.04.2024 22:23

Я спрашиваю об источнике данных: база данных или файлы? потому что, если это база данных, вы можете использовать, например, SQL

Amira Bedhiafi 29.04.2024 22:38

Purchase_requisition из базы данных, другие таблицы добавляются в PowerBi. У меня есть доступ только к набору данных Power BI, поэтому я надеюсь завершить его в Power Bi.

Zachary Belanger 29.04.2024 23:44

Со сколькими строками вы имеете дело?

Amira Bedhiafi 29.04.2024 23:46

Более 100 000

Zachary Belanger 30.04.2024 00:58
Ответ принят как подходящий

Ваша модель данных выглядит так? Модель данных

Это желаемый результат, который вы хотите получить с помощью расчетной таблицы? Желаемый результат


[Обновление] Отлично! В этом случае вы действительно пытаетесь добавить дополнительные столбцы в таблицу фактов. Мы знаем, что таблица фактов связана со всеми таблицами измерений отношением «многие к одному», поэтому в каждой таблице измерений есть только одна соответствующая строка, которая нам нужна. Учитывая существование отношений, если ваша модель будет находиться в режиме импорта, вы можете просто применить этот код для получения желаемого результата (т. е. получения соответствующей строки из таблицы измерений вместо использования 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

Вот скриншоты обоих выходов: Режим импортаПрямой запрос

Надеюсь, это поможет и удачи в вашем проекте!

Да, именно в обоих случаях модель данных и желаемый результат верны.

Zachary Belanger 01.05.2024 03:01

Идеальный! Я только что обновил свой первоначальный ответ решением. Я надеюсь, что это помогает!

Sergii Zelenko 02.05.2024 16:30

Другие вопросы по теме